我已经将一个完整的文件缓存在一个数组soc_data(@soc_data)中。现在,我试图在文件的每一行中复制一个模式,或者我们可以说出数组的每个元素。
我已经用过了。但这不能正常工作,并且flag始终为1,但是它应该切换,因为该模式不是在每一行中都存在,而仅在几行中存在。
my $flag = 0 ;
if(grep(" ".$val." ".$instance, @soc_data)){
$flag = 1 ;
}
else {
$flag = 0 ;
}
请提出解决方法以及我在这里犯的错误。
答案 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) { ... }
(我真的不知道您所说的“切换”是什么意思,所以我可能没有正确解决您的问题的那一部分)