Регулярные выражения Perl и их применение


         

Встроенный код и директивы my и local - часть 2


$_='ab'; our $o=1; my $m=1; / (?{ local $o }) (?: a (?{ $o++; $m++ })| ab (?{ print "\$o=$o, \$m=$m" }) ) $ /x;

На сей раз напечатается это:

$o=1, $m=2

Этот пример показывает работу директивы local во встроенном коде.

Не забывайте в конце регулярного выражения запоминать значения локализованных переменных, т.к. при выходе за регулярное выражение они утрачиваются.

Если объявить переменную my внутри регулярного выражения, то в других блоках встроенного кода переменная с этим именем не будет соответствовать той переменной, что была объявлена. Она либо будет создана заново как глобальная, либо, если переменная с этим именем уже существует до регулярного выражения, она будет отождествлена с ней. При возврате такая переменная не будет восстанавливать свои старые значения. Вот два примера:

$_='ab'; our $o=1; / (?{ my $m=10; local $o }) (?: a (?{ $o++; $m++ })| ab (?{ print "\$o=$o, \$m=$m" }) ) $ /x;

Напечатается

$o=1, $m=1

Мы видим, что во втором встроенном коде переменная $m создалась заново с неопределенным значением, затем к нему применили ++ и получили 1. И это значение потом использовалось при печати.

$_='ab'; our $o=1; my $m=10; / (?{ my $m=5; local $o }) (?: a (?{ $o++; $m++ })| ab (?{ print "\$o=$o, \$m=$m" }) ) $ /x;

Здесь напечатается

$o=1, $m=11

Во втором и третьем встроенном коде использовалась переменная $m, которая была создана до регулярного выражения.

Директиву local можно комбинировать с присваиванием значения этой переменной.

Например:

local ($ctop) = $ctop+1;

© 2003-2007 INTUIT.ru. Все права защищены.




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