2013-07-24 40 views
1

我有一个数组Perl的检查如果一个标量包含在阵列中

my @array = qw/FOO BAR BAZ/; 

和从含有数据的文件等

+++123++585+++FOO 

+++589++458+++XYZ 
读取标量的元素之一

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

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

+0

正则表达式?是? – gaussblurinc

+0

'do {if($ str =〜m/$ _ /){print“YES!”;打印; print“\ n”}} for @ array' – gaussblurinc

+0

@loldop,OP表示他们更喜欢一种不涉及循环数组的方式。 –

回答

4

您可以建立符合所有@array的正则表达式:

my $regex = join '|', map quotemeta, @array; 
$string =~ $regex; 
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) { 
    ... 
    } 
} 
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更多这些。

+0

'grep','map'和'reduce'意味着一个循环,在这里是非常不必要的,尽管你对HOP的了解是值得赞美的。 – amon

+0

虽然我同意'grep','map'和'reduce'本质上是循环迭代,我可以看到我的解决方案不是最优的。也就是说,OP确实想要一个看起来更加完美的解决方案。我会让这个答案作为提醒,给予认真的答案,而不是半生不熟的答案。 –

相关问题