Аналог sql-функции in() в Perl-коде
Те, кто часто составляет sql-запросы, часто потом замечают, что, программируя на своем языке, хотелось бы иметь в арсенале нечто аналогичное функции in(). У меня, по крайней мере, такое желание проявлялось неоднократно. В конечном итоге надоело каждый раз на ходу ваять один и тот же самокат, и я оформил эту функцию по всем правилам. Теперь она кочует из проекта в проект и иногда экономит немножко времени. Мелочёвка, но все равно приятно. В общем, делюсь.
sub in {
=pod
=item B<in>( $value, \@list )
Purpose:
* Проверка вхождения текстового значения в список
Arguments:
* Scalar - значение
* Arrayref - список
Returns:
* Scalar - логический результат
* Array - массив найденных совпадений
=cut
my $value = shift();
my $list = shift() || [];
my @ret = ();
$value = '' unless defined $value;
@ret = grep { defined $_ && $value eq $_ } @{$list};
return wantarray ? @ret : 1+$#ret;
}Примеры использования. if ( in(1, [1,2,3]) ) {
print "Found!\n"
}
else {
print "Not found!\n"
}Обратите внимание! Ищется именно текстовое вхождение. Таким образом, в следующем примере условие поиска не выполняется: if ( in('01', ['1','2','3']) ) {
print "Found!\n"
}
else {
print "Not found!\n"
}Впрочем, если нужно сравнивать числа - вы найдёте здесь выход из положения. ))
То есть если нужно часто что-то искать в списке - лучше сделать список хешем.
Ну а если одноразово, и при этом есть "ощущение", что список довольно длинным может оказаться - искать модификацией алгоритма QuickSort.
Да, и на многоядерных архитектурах искать так вот в лоб, в один поток...