Шаг 118.
В каких случаях функцию local() нельзя заменить функцией my() (начало)

    На этом шаге мы рассмотрим первый случай "незаменимости" функции local().

    В следующих случаях функция local() является незаменимой.

    На этом шаге рассмотрим первый случай.

Присваивание временного значения глобальной переменной

    В первую очередь это относится к некоторым предопределенным глобальным переменным, таким как $ARGV, $_ и т. д. Рассмотрим пример.

#! perl -w
$/ = undef;
@ARGV = ("a");
$_ = <>;
print "Первое значение области ввода \$_= ", split, "\n";
{
  local @ARGV = ("aa");
  local $_ = <>;
  print "Второе значение области ввода \$_= ", split, "\n";
}
{
  local @ARGV = ("aaa");
  local $_ = <>;
  print "Третье значение области ввода \$_= ", split, "\n"; 
} 
print "Восстановленное значение области ввода \$_= ", split, "\n";
Текст этого примера вместе с файлами можно взять здесь.

    Пусть имеются три файла

"а":	
1111 1111 1111		
аааа bbbb cccc
"аа":
2222 2222 2222	
dddd eeee ffff
"ааа":
3333 3333 3333
gggg hhhh iiii

    В приведенной программе используются специальные глобальные переменные $/, $_ и @ARGV.

    Специальная переменная $/ содержит значение разделителя входных записей, которым по умолчанию является символ новой строки. Присваивание этой переменной неопределенного значения позволяет при помощи одной операции ввода <> считать весь файл, а не только первую строку.

    Специальная переменная $_ используется по умолчанию для сохранения вводимых данных, если в операции ввода соответствующий параметр не указан. Она также используется по умолчанию в качестве аргумента функции split(), если в ней не задана строка, подлежащая разбиению на отдельные строки.

    Массив @ARGV содержит аргументы командной строки самой программы. Если при вызове программы ей будет передано имя файла, то оно будет сохранено в массиве @ARGV. Операция ввода <> применяется к файлам, переданным в программу в качестве аргументов командной строки, т. е. к файлам, имена которых хранятся в массиве @ARGV. В нашем примере программа вызывается без аргументов, поэтому имя входного файла "а" задается внутри программы прямой записью в массив @ARGV. Первая операция ввода <>, следовательно, осуществляется из файла "а". Далее следуют два блока операторов, заключенных в фигурные скобки. В каждом из них при помощи функции local() создаются временные значения для глобальных переменных @ARGV и @_. В первом блоке данные считываются из файла "аа" и сохраняются в качестве временного значения глобальной переменной $_, во втором - из файла "ааа" и также сохраняются в качестве следующего временного значения переменной $_. По выходе из второго блока глобальная переменная $_ восстанавливает свое первоначальное значение. В результате выполнения данной программы будет напечатано (рисунок 1):


Рис.1. Результат работы примера

    На следующем шаге мы продолжим изучение этого вопроса.




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