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


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


foreach my $item (@array)  {

print   'l = $item\n , }

Цикл foreach обладает еще одним свойством: в цикле переменная-итератор яв­ляется не копией, а скорее синонимом (alias) текущего элемента. Иными словами, изменение итератора приводит к изменению каждого элемента списка.

@аггау =  (1,2,3), foreach $item (@array)  {

$item--, }

print @array , 0 1 2

й Умножить каждый элемент @>a и @b на семь @а = ( 5, 3) @b = (0, 1) foreach $item (@a, @b) {

•$item *= 7,

print    Sitem    , > 3.5  21   0  7

Модификация списков в цикле foreach оказывается более понятной и быстрой, чем в эквивалентном коде с циклом for и указанием конкретных индексов. Это не ошибка; такая возможность была намеренно предусмотрена разработчиками язы­ка. Не зная о ней, можно случайно изменить содержимое списка. Теперь вы знаете.

Например, применение s/// к элементам списка, возвращаемого функцией values, приведет к модификации только копий, но не самого хэша. Однако срез хэша (s>hash{ keys %hash} (см. главу 5 «Хэши») дает нам нечто, что все же можно из­менить с пользой для дела:

# Убрать пропуски из скалярной величины, массива и всех элементов хэша foreach (Sscalar, @array, @hash{keys %hash}) {

s/\s+$//, }

По причинам, связанным с эквивалентными конструкциями командного интер­претатора Борна для UNIX, ключевые слова for и foreach взаимозаменяемы:

for $item (@array)  {    # То же,   что и foreach $item (@array) # Сделать что-то

for (@array)                {    # То же,   что и foreach $_ (@array)


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

# Сделать что-то }

Подобный стиль часто показывает, что автор занимается написанием или со­провождением сценариев интерпретатора и связан с системным администрирова­нием UNIX. Жизнь таких людей н без того сложна, поэтому не стоит судить их слишком строго.

О Смотри также

Разделы «For Loops», «Foreach Loops» и «Loop Control» perlsyn(l); раздел «Temporary Values via local()» peiisub(l). Оператор local() рассматривается в рецепте 10.13, a my() — в рецепте 10.2.




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