2013-07-24 3 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"}} для @ 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 

grep, reduce и map, что мы называем функции высшего порядка в FP мире, хотя reduce можно назвать fold там. Посмотрите на Perl MJD для более высокого порядка.

+0

'grep',' map' и 'reduce' подразумевают цикл, который здесь совершенно не нужен, хотя ваши знания о HOP заслуживают похвалы. – amon

+0

Хотя я согласен, что 'grep',' map' и 'reduce' являются, по существу, итерациями цикла под капотом, я вижу, как мое решение меньше оптимального. Тем не менее, OP действительно нуждалось в решении, которое выглядело бы более perlish. Я позволю этому ответу быть напоминанием, чтобы дать рассмотренные ответы, а не полуобработанные. –