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


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


Проблема

Требуется повторить некоторую операцию для каждого элемента списка.

Массивы часто используются для сбора интересующей информации - напри­мер, имен пользователей, превысивших свои дисковые квоты. Данные обрабаты­ваются, при этом с каждым элементом массива выполняется некоторая операция. Скажем, в примере с дисковыми квотами каждому пользователю отправляется предупреждающее сообщение.

Решение

Воспользуйтесь циклом f о reach:

foreach $item (LIST)  {

# Выполнить некоторые действия с $item }

Комментарий

Предположим, в массиве @bad_users собран список пользователей, превысивших свои дисковые квоты. В следующем фрагменте для каждого нарушителя вызыва­ется процедура complain():

foreach $user  (@bad_users)   {

cornplain($user), >

Столь тривиальные случаи встречаются редко. Как правило, для генерации списка часто используются функции

foreach $var  (sort  keys %ENV)  {

print  '$var=$ENV{$var}\n  , }

Функции sort и keys строят отсортированный список имен переменных ок­ружения. Конечно, многократно используемые списки следует сохранять в масси­вах. Но для одноразовых задач удобнее работать со списком напрямую.

Возможности этой конструкции расширяются не только за счет построения списка в foreach, по и за счет дополнительных операций в блоке кода. Одно из рас­пространенных применений foreach — сбор информации о каждом элементе спис­ка и принятие некоторого решения на основании полученных данных. Вернемся к примеру с квотами:

foreach $user (@all_users) {

$disk_space = get_usage($user);  ff  Определить объем используемого

#      дискового пространства

if ($disk_space > $MAX_QU0TA) {  #   Если он больше допустимого .

complain($user),      й      .  предупредить о нарушении


122   Глава 4 • Массивы

Возможны и более сложные варианты. Команда last прерывает цикл, next пере­ходит к следующему элементу, a redo возвращается к первой команде внутри блока. Фактически вы говорите: «Нет смысла продолжать, это не то, что мне нужно» (next), «Я нашел то, что искал, и проверять остальные элементы незачем» (last) или «Я тут кое-что изменил, так что проверки и вычисления лучше выполнить заново» (redo).




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