2013-07-24 68 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確實想要一個看起來更加完美的解決方案。我會讓這個答案作爲提醒,給予認真的答案,而不是半生不熟的答案。 –

相關問題