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

Perl 如何为数组的每个元素grep一个模式,perl,Perl,我已经在数组soc_data(@soc_data)中缓冲了一个完整的文件。现在我正在尝试在文件的每一行或数组的每一个元素中创建一个模式 我已经用过了,但它不能正常工作,flag总是1,但它应该切换,因为模式不是每行都有,而是只有几行 my $flag = 0 ; if(grep(" ".$val." ".$instance, @soc_data)){ $flag = 1 ; } else { $flag = 0 ; } 请建议我的方法和我在这里犯的错误。它无法与您编写的代码切换。您的代

我已经在数组soc_data(@soc_data)中缓冲了一个完整的文件。现在我正在尝试在文件的每一行或数组的每一个元素中创建一个模式

我已经用过了,但它不能正常工作,flag总是1,但它应该切换,因为模式不是每行都有,而是只有几行

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

请建议我的方法和我在这里犯的错误。

它无法与您编写的代码切换。您的代码将检查阵列中是否出现该模式。将依次查看每一行(数组中的元素),并返回与模式匹配的行的列表。然后你的旗帜被设置,你就完成了

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
}

它不能与您编写的代码切换。您的代码将检查阵列中是否出现该模式。将依次查看每一行(数组中的元素),并返回与模式匹配的行的列表。然后你的旗帜被设置,你就完成了

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
}

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
可能有regexp元字符

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

(我真的不知道你所说的“切换”是什么意思,所以我可能没有正确地回答你问题的这一部分)

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
可能有regexp元字符

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

(我真的不知道你所说的“切换”是什么意思,所以我可能没有正确地回答你问题的这一部分)

感兴趣的:我怀疑也有类似的so Q。感兴趣的:我怀疑也有类似的so Q。Re“
my$flag=0;$flag=1如果$line=~m/$val$instance/;
”,或者只是
my$flag=$line=~/$val$instance/@ikegami谢谢你添加这个。我决定不把它放在答案中,因为OP有
if
结构,我想坚持它。不知何故,他们觉得使用它比只获取匹配的返回值更舒服。Re“
my$flag=0;如果$line=~m/$val$instance/;
”,则$flag=1,或者只是
my$flag=$line=~/$val$instance/@ikegami谢谢你添加这个。我决定不把它放在答案中,因为OP有
if
结构,我想坚持它。从某种程度上说,他们会觉得这比仅仅接受比赛的回报更舒服。