В каких случаях функцию local нельзя заменить функцией ту
В каких случаях функцию 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