Поиск всех элементов массива, удовлетворяющих определенном критерию

Проблема

Требуется найти все элементы списка, удовлетворяющие определенному критерию.
Проблема извлечения подмножества из списка остается прежней. Вопрос заключается в том, как найти всех инженеров в списке работников, всех пользователей в административной группе, все интересующие вас имена файлов и т. д.

Решение

Воспользуйтесь функцией grep. Функция применяет критерий ко всем элементам списка и возвращает лишь те, для которых он выполняется:
@РЕЗУЛЬТАТ = grep { КРИТЕРИЙ ($_) } @СПИСОК;

Комментарий

То же самое можно было сделать в цикле foreach:
@РЕЗУЛЬТАТ = ();
foreach (@СПИСОК) {
  push(@РЕЗУЛЬТАТ, $_) if КРИТЕРИЙ ($_);
}
Функция Perl grep позволяет записать всю эту возню с циклами более компактно. В действительности функция grep сильно отличается от одноименной команды UNIX — она не имеет параметров для нумерации строк или инвертирования критерия и не ограничивается проверками регулярных выражений. Например, чтобы отфильтровать из массива очень большие числа или определить, с какими ключами хэша ассоциированы очень большие значения, применяется следующая запись:
@bigs = grep { $_ > 1_000_000 } @nums;
@pigs = grep { $users{$_} > 1e7 } keys %users;
В следующем примере в @matching заносятся строки, полученные от команды who и начинающиеся с "gnat":
@matching = grep { /^gnat / } 'who';
Или другой пример:
@engineers = grep { $_->position() eq 'Engineer' } @employees;
Из массива @employees извлекаются только те объекты, для которых метод position() возвращает строку Engineer. grep позволяет выполнять и более сложные проверки:
@secondary_assistance = grep { $_->income >= 26_000 &&
                               $_->income < 30_000 }
@applicants;
Однако в таких ситуациях бывает разумнее написать цикл.

См. также




2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: