Perl检查标量是否包含数组中的一个元素

时间:2013-07-24 08:10:13

标签: perl

我有一个数组

my @array = qw/FOO BAR BAZ/;

从包含

等数据的文件中读取标量
+++123++585+++FOO

+++589++458+++XYZ

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

我知道我可以循环遍历数组并按照这种方式进行匹配,但是想知道是否有更多的perl方式。

3 个答案:

答案 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

grepreducemap是我们在FP世界中所谓的高阶函数,尽管reduce可能在那里被称为fold。看看MJD的高阶Perl更多这些。