|
В каких случаях функцию local нельзя заменить функцией ту
В следующих случаях функция local
() является незаменимой. П Присваивание временного значения глобальной переменной.
В первую очередь это относится к некоторым предопределенным глобальным переменным,
таким как $ARGV, $_ и т. д. Рассмотрим пример.
#!/usr/bin/perl $/ = under";
@ARGV = ("а"); $_ = <>;
print "Первое значение области
ввода \$_= ", split,"\п"; {
local 0ARGV = ("аа");
local $_ = <>;
print "Второе значение области
ввода \$_= ", split,"\п"; }
{
local 8ARGV = ("ааа");
local $_ = <>;
@fields = split;
print "Третье значение области
ввода \$_= ", split, "\n";
}
print "Восстановленное значение
области ввода \$_= ", split,"\n";
Пусть имеются три файла
"а": "аа":
"ааа":
1111 1111 1111 2222 2222 2222
3333 3333 3333
аааа bbbb cccc dddd eeee ffff
gggg hhhh iiii
В приведенной программе используются
специальные глобальные переменные $/, $_ И OARGV.
Специальная переменная $/ содержит
значение разделителя входных записей, которым по умолчанию является символ новой
строки. Присваивание этой переменной неопределенного значения позволяет при
помощи одной операции ввода <> считать весь файл, а не только первую строку.
Специальная переменная $_ используется
по умолчанию для сохранения вводимых данных, если в операции ввода соответствующий
параметр не указан. Она также используется по умолчанию в качестве аргумента
функции split о, если в ней не задана строка, подлежащая разбиению на отдельные
строки.
Массив @ARGV содержит аргументы
командной строки самой программы. Если при вызове программы ей будет передано
имя файла, то оно будет сохранено в массиве @ARGV. Операция ввода о применяется
к файлам, переданным в программу в качестве аргументов командной строки, т.
е. к файлам, имена которых хранятся в массиве @ARGV. В нашем примере программа
вызывается без аргументов, поэтому имя входного файла "а" задается
внутри программы прямой записью в массив @ARGV. Первая операция ввода о, следовательно,
осуществляется из файла "а". Далее следуют два блока операторов, заключенных
в фигурные скобки. В каждом из них при помощи функции local () создаются временные
значения для глобальных переменных @ARGV и @_. В первом блоке данные считываются
из файла "аа" и сохраняются в качестве временного значения глобальной
переменной $_, во втором — из файла "ааа" и также сохраняются в качестве
следующего временного значения переменной $_. По выходе из второго блока глобальная
переменная $_ восстанавливает свое первоначальное значение. В результате выполнения
данной программы будет напечатано:
Первое значение области ввода
$_= 11111111llllaaaabbbbcccc Второе значение области ввода $_= 222222222222ddddeeeeffff
Третье значение области ввода $_= 3333333333 ; 33gggghhhhiiii Восстановленное
значение области ввода $_= lilllllllllllaaaabbbbcccc
- Создание локального дескриптора
файла, каталога или локального псевдонима для функции.
В следующем примере функция local
о используется для создания локального дескриптора файла внутри блока операторов.
#!/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; > J
print FILEHANDLE "Еще одна
строка в файл 'b'\n"; close FILEHANDLE;
В результате выполнения данного
сценария в текущем каталоге будут созданы файлы:
"b":
Новая строка в файл 'b'
Еще одна строка в файл 'b'
"bb":
Новая строка в файл 'bb'
"bbb":
Новая строка в файл 'bbb'
Заметьте, что во время выполнения
операций с файлами "bb" и "bbb" файл "Ь" остается
открытым.
Аналогичным образом может быть
определено локальное имя для функции.
#!/usr/bin/perl
# функция NumberOfArgs() возвращает
число своих параметров sub NumberOfArgs {
return $#_ + 1;
) ' . . ' print "NumberOfArgs:
число параметров=", NumberOfArgs(1,2,3,4),"\n"; {
local *Numbers = *NumberOf Args;
print "Numbers: число параметров=",
Numbers (1, 2, 3} , "\n"; } {
local *N = \SNumberOfArgs;
print "N: число параметров=",
N(1,2), "\n"; }
Результат выполнения:
NumberOfArgs: число параметров=4
Numbers: число параметров=3 N: число параметров=2
- Временное изменение элемента
массива или хеш-массива.
В следующем примере внутри блока
операторов временно изменяется значение одного элемента глобального хеш-массива
%ENV, содержащего значение переменной $РАТН, входящей в состав среды интерпретатора
UNIX shell.
tt!/usr/bin/perl
print "значение переменной
среды \$РАТН:\n$ENV{PATH}\n"; {
local $ENV{PATH} = "/home/mike/bin";
I -print "временное значение переменной среды \$РАТН: $ENV{PATH}\n";
}
print "прежнее значение переменной
среды \$РАТН:\n$ENV{PATH}\n";
Результат будет выведен в следующем
виде:
значение переменной среды $РАТН:
/sbin: /usr/sbin: /usr/bin: /bin:
/usr/XHR6/bin: /usr/local/
bin: /opt/bin
временное значение переменной среды
$РАТН: /home/mike/bin
прежнее значение переменной среды
$РАТН:
/sbin: /usr/sbin: /usr/bin: /bin:
/usr/XHR6/bin: /usr/local/bin: /opt/bin
|