Шаг 17.
Цикл for

    На этом шаге мы рассмотрим использование цикла for.

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

[МЕТКА:] foreach <ПЕРЕМЕННАЯ> (<СПИСОК>) <БЛОК>
[МЕТКА:] foreach <ПЕРЕМЕННАЯ> (<СПИСОК>) <БЛОК> continue 
<БЛОК1>

    Он реализует цикл по элементам списка список, присваивая на каждом шаге цикла переменной ПЕРЕМЕННАЯ значение выбранного элемента списка. Блок операторов continue выполняется всякий раз, как начинается очередная итерация, за исключением первой итерации, когда переменная равна первому элементу списка. Список можно задавать или последовательностью значений, разделенных запятыми, или массивом скаляров, или функцией, возвращаемым значением которой является список. Определение максимального элемента массива можно переписать с циклом foreach:

@array = (1, -6, 9, 18, 0, -10);
$max = $array[0];       # Присваиваем переменной значение 1 элемента
foreach $temp (@array) {
       $max = $temp if $temp > $max;   #  Если элемент массива 
    # больше значения переменной $max, то переменная $max становится 
    # равной значению этого элемента. Обратите внимание, что 
    # выражение выполняется справа налево.
}
print “$max”;
Текст этого примера можно взять здесь.

    На каждом шаге цикла переменная $temp последовательно принимает значения элементов массива $аггау. Обратите внимание на внешний вид программы — в отсутствии индексов массива она стала лучше читаемой.

    Следующая особенность оператора foreach связана с переменной цикла. По умолчанию эта переменная является локальной, область видимости которой ограничена телом цикла. Она создаётся только на время выполнения оператора foreach, доступна внутри тела цикла и уничтожается при выходе из цикла. Обычно программисты, работающие на Perl, вообще не применяют в циклах foreach переменную цикла. Это связано с тем обстоятельством, что в отсутствие явно заданной переменной цикла Perl по умолчанию использует специальную переменную $_. На каждом шаге цикла именно она будет содержать значение элемента списка или массива.

    Приведём пример, демонстрирующий как просто можно умножить каждый элемент массива на некоторое число:

@array = (1, 2, 3);
$_*=2 foreach @array;      # Умножение каждого элемента на 2.
print “@array”;            # Напечатает строку: 2 4 6
Текст этого примера можно взять здесь.

    Последняя особенность оператора foreach, которая также связана с переменной цикла, заключается в том, что фактически на каждом шаге выполнения цикла эта переменная является синонимом того элемента списка, значение которого она содержит. Это означает, что её изменение в цикле приводит к изменению значения соответствующего элемента списка. Это свойство цикла foreach удобно для изменения значений элементов списка. Например, возвести в квадрат каждый элемент списка можно следующим оператором foreach:

@array = (1, 2, 3);
foreach $temp (@array) {
       $temp **=2;  # Бинарная арифметическая операция (**) – возведение
                    # в степень. 
}
print “@array”;     # Напечатает строку: 1 4 9
Текст этого примера можно взять здесь.

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

%array = (
blue  => 1,
red   => 2,
green => 3,
yellow => 3 
); 
foreach (sort keys %array) {
print "$_ \t => $array{$_}\n";
} 
Эта программа напечатает пары ключ/значение хеш-массива %аггау в соответствии с алфавитным порядком его ключей:
blue	=>	1
green	=>	3
red	=>	2
yellow	=>	3
Текст этого примера можно взять здесь.


    Замечание. Цикл foreach выполняется быстрее аналогичного цикла for, так как не требует дополнительных затрат на вычисление индекса элемента списка.

    На следующем шаге мы рассмотрим команды управления циклом.




Предыдущий шаг Содержание Следующий шаг