Поиск всех элементов массива, удовлетворяющих определенном критерию
Проблема
Требуется найти все элементы списка, удовлетворяющие определенному критерию.
Проблема извлечения подмножества из списка остается прежней. Вопрос заключается в том, как найти всех
инженеров в списке работников, всех пользователей в административной группе, все интересующие вас
имена файлов и т. д.
Решение
Воспользуйтесь функцией
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;
Однако в таких ситуациях бывает разумнее написать цикл.
См. также
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|