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


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


Переменная, которой последовательно присваиваются все элементы списка, называется переменной цикла или итератором. Если итератор не указан, исполь­зуется глобальная переменная $_. Она используется по умолчанию во многих строковых, списковых и файловых функциях Perl. В коротких программных бло­ках пропуск $_ упрощает чтение программы (хотя в длинных блоках излишек не­явных допущений делает программу менее понятной). Например:

fо reach  ( who )   { if (/tchrist/)  { print,

Или в сочетании с циклом while:

while (<FH>) {      и Присвоить $_ очередную прочитанную строку

chomp;            # Удалить из $_ конечный символ \п,

# если он присутствует

foreach (split) {     Я Разделить $_ по пропускам и получить @_

# Последовательно присвоить $_

#  каждый из полученных фрагментов
$_ = reverse,     и Переставить символы $_

#  в противоположном порядке
print           8 Вывести значение $_

Многочисленные применения $_ заставляют понервничать. Особенно беспоко­ит то, что значение $_ изменяется как в foreach, так и в while. Возникает вопрос — не будет ли полная строка, прочитанная в $_ через <FH>, навсегда потеряна после выполнения foreach?

К счастью, эти опасения необоснованны — но крайней мере, в данном слу­чае. Perl не уничтожает старое значение $_, поскольку переменная-итератор ($_) существует в течение всего выполнения цикла. При входе во внутренний цикл старое значение автоматически сохраняется, а при выходе — восстанавлива­ется.

Однако причины для беспокойства все же есть. Если цикл while будет внутрен­ним, a foreach — внешним, ваши страхи в полной мере оправдаются. В отличие от foreach конструкция while <FH> разрушает глобальное значение $_ без предва­рительного сохранения! Следовательно, в начале любой процедуры (или блока), где $_ используется в подобной конструкции, всегда должно присутствовать объявление local $ .


4.4. Выполнение операции с каждым элементом списка    123

Если в области действия (scope) присутствует лексическая переменная (объяв­ленная с ту), то временная переменная будет иметь лексическую область дей­ствия, ограниченную данным циклом. В противном случае она будет считаться гло­бальной переменной с динамической областью действия. Во избежание странных побочных эффектов версия 5.004 допускает более наглядную и понятную запись:




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