Friday, May 6, 2011

Perl: как определить, содержится ли определенный элемент в массиве


  1. В Perl версии 5.10 и выше можно использовать оператор ~~ (smart match):
    use 5.010;

    if ( $item ~~ @array ) {
    print "The array contains $itemn";
    }

    Этот оператор обходит массив в поиске нужного элемента и останавливается, как только будет найден первый элемент. (Этим он выгодно отличается от grep).

    Стоит отметить, что оператор ~~ работает "рекурсивно", т.е.
    if ($scalar ~~ @array) { ... }

    эквивалентно
    if ($scalar ~~ $array[0] or $scalar ~~ $array[1] ...) { ... }


  2. Если версия Perl < 5.10, либо поиск по массиву требуется проводить более одного раза, оптимальным способом будет преобразовать массив в хэш и использовать поиск по хэшу:
    my @array = qw(item1 item2 item3);
    my %hash = map { $_ => 1 } @array;

    if ($hash{$item}) {
    print "The array contains $itemn";
    }


  3. Для однократных тестов также подходит функция first из стандартного модуля List::Util. Как и оператор ~~, она возвращает первый найденный элемент. Но в Perl 5.10 и выше все же лучше использовать ~~, т.к. он гораздо быстрее за счет отсутствия накладных расходов на вызов функции.


  4. Если массив относительно небольшой, и ~~ не поддерживается, то можно просто использовать grep в скалярном контексте. В этом случае возвращается число найденных элементов:

    if (my $found = grep $_ eq $item, @array) {
    print "The array contains $itemn";
    }



  5. Для небольших целых чисел можно также использовать индексированный массив:
    my @numbers = (2, 3, 5, 7, 11);
    my @is_contained;
    @is_contained[@numbers] = (1) x @numbers;

    if ($is_contained[$item]) {
    print "The array contains $item";
    }

No comments:

Post a Comment