如何为数组的每个元素grep模式

时间:2018-07-11 13:31:13

标签: perl

我已经将一个完整的文件缓存在一个数组soc_data(@soc_data)中。现在,我试图在文件的每一行中复制一个模式,或者我们可以说出数组的每个元素。

我已经用过了。但这不能正常工作,并且flag始终为1,但是它应该切换,因为该模式不是在每一行中都存在,而仅在几行中存在。

my $flag = 0 ;
if(grep("  ".$val." ".$instance, @soc_data)){
  $flag = 1 ;
}
else {
 $flag = 0 ;
}

请提出解决方法以及我在这里犯的错误。

2 个答案:

答案 0 :(得分:5)

它无法切换您编写的代码。您的代码检查数组中是否存在任何模式。 grep将依次查看每一行(数组中的元素),并返回与该模式匹配的列表。然后设置您的标志就可以完成。

my @list = ( 1 .. 20 );
my @match = grep /3/, @list;
print "@match";

# 3 13

如果要单独执行每一行,则需要在外部循环中自己遍历数组,然后进行匹配。则不需要grep

foreach my $line (@soc_data) {
    my $flag = 0;
    $flag = 1 if $line =~ m/  $val $instance/; # you might want to use \s

    # do things with $flag
}

答案 1 :(得分:1)

grep通常用于将正则表达式应用于字符串列表,但是Perl中的grep则更通用,如果您要使用正则表达式,则必须显式使用它使用grep。比较:

@list = (7,8,9,10);
print grep /1/, @list;        # 10 -- only "10" matches /1/
print grep 1, @list;          # 7 8 9 10, EXPR is always true

您对grep的使用更像第二种情况。 grep的第一个参数只是一个非空且非零的标量,因此它始终为“ true”,并且grep的返回值始终为列表中的每个元素。我怀疑你想要类似的东西

if (grep / $val $instance/, @soc_data) { ... }

或者如果$val$instance可能具有正则表达式元字符,

if (grep / \Q$val\E \Q$instance\E/, @soc_data) { ... }

(我真的不知道您所说的“切换”是什么意思,所以我可能没有正确解决您的问题的那一部分)