1

我有一个数组

my @array = qw/FOO BAR BAZ/;

以及从包含以下数据的文件中读取的标量

+++123++585+++FOO

或者

+++589++458+++XYZ

我正在寻找一种检查数组元素是否与输入字符串的一部分匹配的好方法。

我知道我可以循环遍历数组并以这种方式匹配,但想知道是否有更类似于 perl 的方式。

4

3 回答 3

4

您可以创建一个匹配所有@array 的正则表达式:

my $regex = join '|', map quotemeta, @array;
$string =~ $regex;
于 2013-07-24T08:36:58.003 回答
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) {
    ...
  }
}
于 2013-07-24T08:37:34.383 回答
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

grepreduce并且map是我们在 FP 世界中所说的高阶函数,尽管reduce可能在fold那里被调用。查看 MJD 的 Higher Order Perl 了解更多信息。

于 2013-07-24T08:39:23.977 回答