我有一个数组
my @array = qw/FOO BAR BAZ/;
从包含
等数据的文件中读取标量+++123++585+++FOO
或
+++589++458+++XYZ
我正在寻找一种很好的方法来检查数组的元素是否与输入字符串的一部分匹配。
我知道我可以循环遍历数组并按照这种方式进行匹配,但是想知道是否有更多的perl方式。
答案 0 :(得分:4)
您可以创建一个匹配所有@array的正则表达式:
my $regex = join '|', map quotemeta, @array;
$string =~ $regex;
答案 1 :(得分:2)
是的,有更好的方法。您可以构造正则表达式。它将是固定字符串的替代品,幸运的是它被翻译成trie(Aho-Corasick),这导致线性搜索时间。这是最有效的方式。
my @array = qw/FOO BAR BAZ/;
my $re = join '|', map quotemeta, @array;
$re = qr/$re/;
for my $string (@strings) {
if ($string =~ $re) {
...
}
}
答案 2 :(得分:0)
这正是grep的用途。这是一个小片段:
use strict;
use warnings;
my $str = "+++123++585+++FOO";
my $blank = "+++123++585+++XYZ";
my @array = qw/FOO BAR BAZ/;
print grep {$str =~ $_} @array, "\n";
print grep {$blank =~ $_} @array, "\n";
这只会返回:
FOO
grep
,reduce
和map
是我们在FP世界中所谓的高阶函数,尽管reduce
可能在那里被称为fold
。看看MJD的高阶Perl更多这些。