Модификаторы простых операторов
Модификатор foreach
Модификатор foreach ВЫРАЖЕНИЕ относится к модификаторам цикла. Он повторно выполняет простой оператор, осуществляя итерации по списку значений, заданному в ВЫРАЖЕНИЕ. На каждой итерации выбранный элемент списка присваивается встроенной переменной $_, которую можно использовать в простом операторе для получения значения выбранного элемента списка. Например, следующий оператор распечатает все элементы массива @т:
print "$_ " foreach @т;
Общий синтаксис простого оператора с модификатором foreach следующий:
ВЫРАЖЕНИЕ foreach ВЫРАЖЕНИЕ-СПИСОК;
Простой оператор с модификатором foreach всего лишь удобная форма записи составного оператора jforeach:
foreach (ВЫРАЖЕНИЕ-СПИСОК) { ВЫРАЖЕНИЕ; }
Эта форма составного оператора foreach в качестве переменной цикла использует встроенную переменную $_ (см. раздел 5.4.3). Обратим внимание читателя на то, что ВЫРАЖЕНИЕ-список вычисляется в списковом контексте, поэтому все используемые в нем переменные ведут себя так, как они должны вести в списковом контексте. Например, хеш-массив представляет обычный список, составленный из последовательности его пар ключ/значение. Следующий фрагмент кода:
%hash = (one › 6, two › 8, three › 10); print "$_ " foreach %hash;
…напечатает строку:
three 10 two 8 one 6
Эта строка и есть тот простой список, который возвращает хеш в списковом контексте.
Относительно модификатора foreach (это же относится и к его эквивалентному оператору foreach) следует сказать одну важную вещь. Дело в том, что переменная $_ является не просто переменной, в которой хранится значение элемента списка текущей итерации, она является синонимом имени этого элемента. Это означает, что любое изменение переменной $_ в простом операторе приводит к изменению текущего элемента списка в цикле. Пример 5.3 демонстрирует, как просто можно умножить каждый элемент массива на некоторое число:
# peri – w §array = (1, 2, 3); $_ *= 2 foreach Sarray; # Умножение каждого элемента на 2. print "@array"; # Напечатает строку: 246