PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 133


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

Проблема

Требуется найти первый элемент списка, удовлетворяющего некоторому крите­рию (или индекс этого элемента). Возможна и другая формулировка — опреде­лить, проходит ли проверку хотя бы один элемент. Критерий может быть как простым («Присутствует ли элемент в списке?»)1, так и сложным («Имеется спи­сок работников, отсортированный в порядке убывания оклада. У кого из менед­жеров самый высокий оклад?»). В простых случаях дело обычно ограничивается значением элемента, но если сам массив может изменяться, вероятно, следует оп­ределять индекс первого подходящего элемента.

Решение

Перебирайте элементы в цикле f о reach и вызовите last, как только критерий будет выполнен:

ray($match,   $found    $itera), foreach $item(@array)   { if (Scnterion)  {

$match = $item,         # Необходимо сохранить

$found = 1

last,

if($found)   {

## Сделать что-то с $match } else {

 Но тогда почему бы не воспользоваться хэшем?


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

## Неудачный поиск >

Чтобы определить индекс, перебирайте все индексы массива и вызывайте last, как только критерий выполнится:

my($i,   $match_idx), for ($1 =0,  $i < @аггау   $i++) { if ($cnterion)  {

$match_idx = $i,       # Сохранить индекс

last,

if(defmed $match_idx)  {

## Найден элемент $array[$match_idx] } else {

## Неудачный поиск

Комментарий

Стандартных механизмов для решения этой задачи не существует, поэтому мы напишем собственный код для перебора и проверки каждого элемента. В нем ис­пользуются циклы f о reach и for, а вызов last прекращает проверку при выполне­нии условия. Но перед тем, как прерывать поиск с помощью last, следует сохра­нить найденный индекс.

Одна из распространенных ошибок — использование функции g rep. Дело в том, что grep проверяет все элементы и находит все совпадения; если вас интере­сует только первое совпадение, этот вариант неэффективен.




- Начало -  - Назад -  - Вперед -