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



     услуги манипулятора |          

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


В следующем примере используется несколько глобальных переменных. Пере­менная $/ косвенно влияет на поведение оператора чтения строк, используемого в операциях <FH>.

$para = get_paragraph(*FH);      Я Передать glob файлового манипулятора $рага = get_paragraph(\*FH);     # Передать манипулятор по ссылке на glob $para = get_paragraph(*IO{FH});   # Передать манипулятор по ссылке на 10 sub get_paragraph {

my $fh = shift;

local $/ = '';

my $paragraph = <$fh>;

chomp($paragraph);

return $paragraph;


10.13. Сохранение глобальных значений   367

Применение local() для создания локальных манипуляторов Вторая ситуация возникает в случае, когда требуется локальный манипулятор файла или каталога, реже — локальная функция. Начиная с Perl версий 5.000, можно воспользоваться стандартными модулями Symbol, Filehandle или IO::Handle, но и привычная методика с тип-глобом по-прежнему работает. Например:

$contents = get_motd(); sub getjnotd {

local *MOTD;

open(MOTD, "/etc/motd")     or die "can't open motd: $!";

local $/ = undef; # Читать весь файл

local $_ = <MOTD>;

close (MOTD);

return $_; }

Открытый файловый манипулятор возвращается следующим образом:

return  *MOTD;

Применение local() в массивах и хэшах

Третья ситуация на практике почти не встречается. Поскольку оператор local в действительности является оператором «сохранения значения», им можно вос­пользоваться для сохранения одного элемента массива или хэша, даже если сам массив или хэш является лексическим!

my @nums = (0 .. 5); sub first {

local $nums[3] = 3.14159;

secondO; } sub second {

print "@nums\n"; }

secondO; 0 12 3 4 5 firstO; 0   1   2 3.14159  4  5

Единственное стандартное применение — временные обработчики сигналов.

sub first {

local $SIG{INT> = 'IGNORE';

secondO; }

Теперь во время работы secondO сигналы прерывания будут игнорироваться. После выхода из first () автоматически восстанавливается предыдущее значение $SIG{INT}.

Хотя local часто встречается в старом коде, от него следует держаться по­дальше, если это только возможно. Поскольку local манипулирует значениями




Содержание  Назад  Вперед