【问题标题】:Need to grep value from in hash in perl需要从 perl 中的哈希中 grep 值
【发布时间】:2020-02-07 16:56:49
【问题描述】:

我需要从下面显示的每一行中 grep 一个特定的值:

ABC_ROOT|/home/pulkit/pulkit_test/ABC/ABC-012/ABC04.16.103/lnx86
DEF_ROOT|/home/pulkit/pulkit_test/DEF/DEF192/DEF19.20.100/lnx86
GHI_ROOT|/home/pulkit/pulkit_test/GHI/GHI19.10.199/lnx86/tools.lnx86
JKL_ROOT|/home/pulkit/pulkit_test/JKL/JKL19.00.000/lnx86

从以上行中,我想提取具有版本号的值(ABC04.16.103DEF19.20.100GHI19.10.199JKL19.00.000)并使用 Perl 将这些值存储在哈希中。为了将这些值存储在一个数组中,我在本网站的帮助下使用了以下代码:

use strict;
use warnings;

open (File, "/home/pulkit/pulkit_test/abc_test.txt");
my @value;

map { m|/([^/]+)/lnx\d+| and push @value, $1 } <File>;

print join( "\n" , @value,"\n");

由于我对 perl 很陌生,请有人帮忙我如何将这些值存储在哈希中。

谢谢

【问题讨论】:

  • 哈希是一个关联数组,这意味着每个元素都有一个key和一个valueABC04.16.103是应该作为元素的key还是value,另一个应该是什么?
  • 提示:my @value; map { m|/([^/]+)/lnx\d+| and push @value, $1 } &lt;File&gt;; 是一种非常糟糕的写作方式my @value = map { m|/([^/]+)/lnx\d+| } &lt;File&gt;;
  • 提示:你不应该使用两个参数 open。使用my $qfn = "..."; open(my $fh, '&lt;', qfn) or die("Can't open \"$qfn\": $!\n"); 还要注意我如何避免对文件句柄使用全局变量,以及如何添加错误检查。 (open 很容易出错,最好在错误信息中包含文件名。)
  • 提示:m{...} 优于 m|...|,因为| 常用于正则表达式模式。
  • 提示:在一个数组中包含多个“值”,那么@values 是比@value 更好的名称。 (如果数组表示单个值的不同部分,则使用@value。)

标签: perl


【解决方案1】:

你可以这样使用:

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

open( FILE, '<', 'sample.txt');

my %R = map { m{^([^\|]*)\|(?:/[^/]*)*/([^/]*)/lnx\d}; $1 => $2 } <FILE>;

print Dumper(\%R);
  • Dumper只是为了方便和容易输出
  • map 可以返回哈希 $1 =&gt; $2 这样做
  • 正则表达式m{^([^\|]*)\|(?:/[^/]*)*/([^/]*)/lnx\d}
  • ^([^\|]*)\| - 这会捕获“键” - 开头的字符串,以 | 结尾
  • (?:/[^/]*)* - 这会跳过值之前的所有目录 - (?:) - 是一个非捕获组

我认为正则表达式有点过分,我建议使用不同的方法:

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

open( FILE, '<', 'sample.txt');

my %R = ();

while (<FILE>) {
    my @fields = split m{[|/]};
    my $value;
    do {
        $value = pop @fields;
    } until $value !~ /lnx\d+/;
    $R{$fields[0]} = $value;
}

print Dumper(\%R);
  • 您将行拆分为多个字段,而不是正则表达式
  • $field[0] 将成为您的密钥
  • 该值将是匹配 /lnx\d/ 的字段之前的最后一个字段
    • pop @fields 获取数组的最后一个元素

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 2011-04-20
    • 2016-02-21
    相关资源
    最近更新 更多