Модификатор fоreach

Модификатор foreach реализует итерации по элементам списка, определяемого выражением-модификатором, вычисляя при этом выражение, к которому он применяется. На каждой итерации значение выбранного элемента списка присваивается специальной встроенной переменной $_, которую можно использовать в вычисляемом выражении для получения значения выбранного элемента списка. Например, следующий оператор распечатает все элементы массива $m, составляя между ними пробелы:
print "$_ " foreach @m;
Общий синтаксис простого оператора с модификатором foreach следующий:
ВЫРАЖЕНИЕ foreach ВЫРАЖЕНИЕ-МОДИФИКАТОР;
Простой оператор с модификатором foreach — всего лишь удобная форма записи составного оператора foreach:
foreach (ВЫРАЖЕНИЕ-МОДИФИКАТОР) { ВЫРАЖЕНИЕ; }
Эта форма составного оператора foreach в качестве переменной цикла также использует специальную переменную $_.
При использовании модификатора foreach его выражение вычисляется в списковом контексте, а это означает, что все используемые в нем переменные ведут себя так, как они должны вести в списковом контексте. Например, хэш-массив представляет обычный список, составленный из последовательности его пар ключ/значение, поэтому следующий фрагмент кода:
%hash = ( Building => 6, street => "Royal", city => "Z" );
print "$_ " foreach %hash;
напечатает строку:
city Z building 6 street Royal
Относительно модификатора foreach (это же, кстати, относится и к эквивалентному ему составному оператору foreach) следует запомнить одну важную вещь: используемая в них переменная $_ является не просто переменной, в которой хранится значение элемента списка текущей итерации, она является синонимом имени этого элемента. Это означает, что любое изменение значения переменной $_ в выражении простого оператора приводит к изменению значения текущего элемента списка в цикле. Данное обстоятельство можно использовать для изменения значений элементов списка. Листинг 5.4 демонстрирует применение подобной техники для извлечения квадратного корня из каждого элемента массива скаляров.
Листинг 5.4. Изменение значений элементов списка
use warnings;
@array = (2.5, 2, 7.8);
$_ = sqrt $_ foreach @array; # Извлечение квадратного корня
                             # из каждого элемента массива
                             # @аrrау и сохранение в этом
                             # же массиве @аrrау.

Следующая страница Содержание главы


Реклама