Аналог sql-функции in() в Perl-коде

19.02.2013г. // Рубрики: Рецепты, 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"
}
Впрочем, если нужно сравнивать числа - вы найдёте здесь выход из положения. ))

Комментарии

  • DRVTiny
    23.08.2016 17:14
    Perl хешами умеет делать то же самое существенно быстрее.
    То есть если нужно часто что-то искать в списке - лучше сделать список хешем.

    Ну а если одноразово, и при этом есть "ощущение", что список довольно длинным может оказаться - искать модификацией алгоритма QuickSort.

    Да, и на многоядерных архитектурах искать так вот в лоб, в один поток...

Рубрики