Поиск несортированного массива в Perl? - PullRequest
2 голосов
/ 21 декабря 2010

У меня есть массив с ... скажем, 100 элементов.Я хочу проверить, соответствует ли какой-либо из элементов определенной строке.Например:

@ array = ('red', 'white', 'blue');

Я также хочу знать, содержит ли массив строку «white» в качествеэлементы. Я знаю, как это сделать с помощью цикла foreach и сравнивать каждый элемент , но ... есть ли более простой (более быстрый) способ, чем циклический просмотр всего массива?*

Ответы [ 4 ]

6 голосов
/ 21 декабря 2010

Perl 5.10 и выше, умный матч :

say 'found' if 'white' ~~ @array;

Для до 5.10, Список :: MoreUtils :

use List::MoreUtils qw{any}; 
print "found" if any { 'white' eq $_ } @array;

Это короткое замыкание - если совпадение найдено, нет необходимости проходить через весь массив.

3 голосов
/ 21 декабря 2010

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

@array = ('red','white','blue');
$key = 'white';
if (grep { $_ eq $key } @array) {
        print $key.' found';
} 
2 голосов
/ 21 декабря 2010

Если вы собираетесь искать в массиве много раз, стоит создать хеш-таблицу из данных вашего массива:

my %array_data = map { $array[$_] => $_ } 0..$#array;
my $search_term = 'white';
if (defined $array_data{$search_term}) {
    print "'$search_term' was found at array index $array_data{$search_term}\n";
}
1 голос
/ 21 декабря 2010

Это не будет быстрее, чем зацикливание, но вы можете использовать grep в Perl.

$ perl -e "@array = ('red','white','blue'); print grep(/^white$/, @array);"
white
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...