Случаи, когда функцию local( ) нельзя заменить функцией my( )

Перейдем к случаям, в которых функция local( ) является незаменимой.
Присваивание временного значения глобальной переменной
В первую очередь, это относится к некоторым предопределенным глобальным переменным, таким как @ARGV, $_ и т. д. Рассмотрим пример (листинг 9.6).
Листинг 9.6. Создание временного значения глобальной переменной
#!/usr/bin/perl
$/ = undef;
@ARGV = ("а");
$_ = <>;
print "Первое значение области ввода \$ = ", split, "\n";
{
  local @ARGV = ("аа");
  local $_ = <>;
  print "Второе значение области ввода \$_ = ", split, "\n";
}
{
  local @ARGV = ("аа");
  local $_ = <>;
  print "Третье значение области ввода \$_ = ", split, "\n";
}
  print "Восстановленное значение области ввода \$_ = ", split, "\n";
Пусть имеются три файла:
1. а:
1111 1111 1111 
аааа bbbb сссс
2. аа:
2222 2222 2222
dddd eeee ffff
3. aаа:
3333 3333 3333 
gggg hhhh iiii
В приведенной программе используются специальные глобальные переменные $/, $_ и @ARGV.
Специальная переменная $/ содержит значение разделителя входных записей, которым по умолчанию является символ новой строки. Присваивание этой переменной неопределенного значения позволяет при помощи одной операции ввода <> считать весь файл, а не только первую строку.
Специальная переменная $_ используется по умолчанию для сохранения вводимых данных, если в операции ввода соответствующий параметр не указан. Она также используется по умолчанию в качестве аргумента функции split( ), если в ней не задана строка, подлежащая разбиению па отдельные строки.
Массив @ARGV содержит аргументы командной строки самой программы. Если при вызове программы ей будет передано имя файла, то это имя будет сохранено в массиве @ARGV. Операция ввода <> применяется к файлам, переданным в программу в качестве аргументов командной строки, то есть к файлам, имена которых хранятся в массиве @ARGV. В нашем примере программа вызывается без аргументов, поэтому имя входного файла а задается внутри программы прямой записью в массив @ARGV. Первая операция ввода <>, следовательно, осуществляется из файла а. Далее следуют два блока операторов, заключенных в фигурные скобки. В каждом из них при помощи функции local( ) создаются временные значения для глобальных переменных @ARGV и @_. В первом блоке данные считываются из файла аа и сохраняются в качестве временного значения глобальной переменной $_, во втором блоке — из файла ааа и также сохраняются в качестве следующего временного значения переменной $_. По выходе из второго блока глобальная переменная $_ восстанавливает свое первоначальное значение. В результате выполнения данной программы будет напечатано:
Первое значение области ввода $_ = 111111111111ааааbbbbсссс 
Второе значение области ввода $_ = 222222222222ddddeeeeffff 
Третье значение области ввода $_ = 333333333333gggghhhhiiii
Восстановленное значение области ввода $_ = 111111111111ааааbbbbсссс
Создание локального дескриптора файла, каталога или локального псевдонима
В следующем примере (листинг 9.7) функция local( ) используется для создания локального дескриптора файла внутри блока операторов.
Листинг 9.7. Создание локального дескриптора файла
#!/usr/bin/perl
open(FILEHANDLE, ">b");
print FILEHANDLE "Новая строка в файл 'b'\n;
{
  local *FILEHANDLE;
  open(FILEHANDLE, ">bb");
  print FILEHANDLE "Новая строка в файл 'bb'\n";
  close FILEHANDLE;
}
{
  local *FILEHANDLE;
  open(FILEHANDLE,">bbb");
  print FILEHANDLE "Новая строка В файл 'bbb'\n";
  close FILEHANDLE;
}
print FILEHANDLE "Еще одна строка в файл 'b'\n";
close FILEHANDLE;
В результате выполнения данного сценария в текущем каталоге будут созданы файлы:
"b":
Новая строка в файл 'b'
Еще одна строка в файл 'b'
"bb":
Новая строка в файл 'bb'
"bbb":
Новая строка в файл 'bbb'
Заметьте, что во время выполнения операций с файлами bb и bbb файл b остается открытым.
Аналогичным образом может быть определено локальное имя для функции, что показано в листинге 9.8.
Листинг 9.8 Создание локального псевдонима функции
#!/usr/bin/perl
# функция NumberOfArgs( ) возвращает число своих параметров
sub NumberOfArgs { 
  return $#_ + 1;
}
print "NumberOfArgs: число параметров = ", NumberOfArgs(1,2,3,4), "\n";
{
  local *Numbers = *NumberOfArgs; 
  print "Numbers: число параметров = ", Numbers(1,2,3), "\n";
}
{
  local *N = \&NumberOfArgs; 
  print "N: число параметров = ", N(1,2), "\n";
}
Результат выполнения:
NumberOfArgs: число параметров = 4
Numbers: число параметров = 3
N: число параметров = 2
Временное изменение элемента массива или хэш-массива
В примере из листинга 9.9 внутри блока операторов временно изменяется значение одного элемента глобального хэш-массива %ENV, содержащего значение переменной $PATH, входящей в состав среды интерпретатора UNIX shell.
Листинг 9.9. Временное изменение элемента хэш-массива
#!/usr/bin/perl
print "значение переменной среды \$PATH:\n$ENV{PATH}\n";
{
  local $ENV{PATH} = "/home/mike/bin"; 
  print "временное значение переменной среды \$PATH: $ENV{PATH}\n";
}
print "прежнее значение переменной среды \$PATH:\n$ENV{PATH}\n";
Результат будет выведен в следующем виде:
значение переменной среды $PATH:
/sbin:/usr/sbin:/usr/bin:/usr/local/bin 
временное значение переменной среды $PATH: /home/mike/bin
прежнее значение переменной среды $PATH:
/sbin:/usr/sbin:/usr/bin:/usr/local/bin

Следующая страница Содержание главы


Реклама