Условный оператор - сравните со значениями, хранящимися в массиве - PullRequest
0 голосов
/ 20 декабря 2010

Нужна помощь в определении рабочего кода Perl вместо "любого из элементов в @array"

%hash = (key1 => 'value1',key2 => 'value2',key3 => 'value3',);

@array= ('value3','value4','value6'); 

if ($hash{ 'key1' } ne <<any of the elements in @array>>) {print "YAY!";}

Ответы [ 4 ]

5 голосов
/ 20 декабря 2010

Решение CPAN: используйте List::MoreUtils

use List::MoreUtils qw{any}; 
print "YAY!" if any { $hash{'key1'} eq $_ } @array;

Зачем использовать это решение поверх альтернатив?

  • Не удается использовать смартсовпадение в Perl до 5.10

  • grep решение проходит по всему списку весь , даже если первый элемент из 1 000 000 длинных списков совпадает.any замкнет и прекратит работу в тот момент, когда будет найдено первое совпадение, поэтому он более эффективен.

4 голосов
/ 20 декабря 2010

Решение 5.10+: используйте smart-match !

say 'Modern Yay!' unless $hash{$key} ~~ @array;
1 голос
/ 20 декабря 2010

Вы также можете использовать хеш:

@hash{"value3","value4","value6"}=undef;
print "YAY" if exists $hash{key1};
1 голос
/ 20 декабря 2010

Вы можете использовать функцию grep . Вот базовый пример:

print "YAY!" if grep { $hash{'key1'} eq $_ } @array;

В таком скалярном контексте, как этот grep, даст вам количество подходящих записей в @array. Если это не ноль, у вас есть совпадение.

...