我正在尝试构建一个Perl程序,其中使用grep
来查找特定字符串并避免其他字符串。
找到相关字符串的解决方案很简单:
open(FILE, "<".$file) or next;
my @listOfLines = <FILE>;
close FILE;
my $strToGrep = "strToFind1|strToFind2";
my @results = grep /$strToGrep/, @listOfLines;
但我如何避免找不到相关字符串?
我想避免:
my @subStrToAvoid = qw/ strToAvoid1 strToAvoid2 strToAvoid3 /;
有没有办法可以像使用Perl grep
一样使用Perl grep
来自bash的某些标志的{{1}}实用程序?
答案 0 :(得分:4)
很容易 - perl的grep
函数不是一个简单的正则表达式grep,它可以在默认情况下做各种魔术。您可以使用几乎任何返回true / false结果的代码块,并且&#39; feed&#39;它与$_
。默认情况下,regex
会对$_
起作用,因此您可以非常轻松地拥有多个正则表达式条件。
所以你可以:
#turn your 'avoid' list into a regex
my $avoid = join ( "|", map { quotemeta } @subStrToAvoid );
#note - quotemeta is here in case @subStrToAvoid includes
#regex meta characters like "|" or "."
$avoid = qr/($avoid)/;
#match your regex but exclude the avoid regex
my @results = grep { m/$strToGrep/ and not m/$avoid/ } @listOfLines;
答案 1 :(得分:0)
grep的第一个参数是一个条件,可以像使用!
的任何其他条件一样被否定:
my $ignore = join "|", qw/ strToAvoid1 strToAvoid2 strToAvoid3 /;
my @result = grep !/$ignore/, @listOfLines;
如果需要,您可以链接greps:
my @out = grep /$ok/, grep !/$notOk/, @list;