假设我有一个字符串数组,例如@matches = ("cat", "zebra", "apple")
,我想打开一个文件并尝试以最简单的方式匹配这些字符串。
while (<MYFILE>)
{
chomp;
if (..some match condition...)
{
..stuff..
}
}
我可以在每一行上使用foreach
来尝试匹配,但我知道在Perl中必须有一个简洁的方法来说“如果字符串X匹配数组Y中的任何模式。”我似乎无法在任何地方找到它。
编辑:
澄清一下,这是效率极低的代码:
while (<MYFILE>)
{
chomp;
foreach $m (@matches)
{
if (~ /$m/)
{
..stuff..
}
}
}
我知道有一些简写方法可以做到这一点。
答案 0 :(得分:2)
如何使用join
制作即兴正则表达式?
my @matches = ("cat", "zebra", "apple");
my $rx = join "|", @matches;
while (<$fh>) {
if ($_ =~ /$rx/) {
# stuff
}
}
答案 1 :(得分:0)
您似乎想要使用@matches
的条目作为正则表达式。然后,您可以将它们加入更大的正则表达式:
my $rx = join '|', @matches;
while (<>) {
do stuff if $_ =~ $rx;
}
如果您想匹配@matches
条目的文字内容,以便@matches = ("foo+")
与行foo+
匹配而不是fooo
符合上述解决方案,您可以像
my $rx = join '|', map quotemeta, @matches;
答案 2 :(得分:0)
my @matches = qw( cat zebra apple );
{ local $" = '|';
while (<>) {
chomp;
if (/@matches/) { ... }
}
}
但要小心。阅读文档:
perldoc perlvar | grep "\$LIST_SEPARATOR" -A 12
:)