Перезапись специальных переменных Perl регулярными выражениями

Kate

Administrator
Команда форума
Когда-то я стал писать на perl из-за встроенных в язык регулярных выражений. Просто пишешь "abc" =~ / (?<x> a) /x; и вуаля: устанавливаются переменные $&, $1, %+, %-, @-, @+, $`, $'.
Однако эти же переменные перезаписываются при использовании следующей регулярки:
"abc" =~ /a/;
print $&; # -> a

"xyz" =~ /y/;
print $&; # -> y
На самом деле, у специльных переменных perl-а обслуживающих регулярки область видимости ограничена своим блоком, как и у переменных объявленных через my.
"abc" =~ /a/;
{
"xyz" =~ /y/;
print $&; # -> y
}
print $&; # -> a
Конечно использовать переменные от двух регулярок одновременно не выйдет - их придётся сохранить в локальных переменных. Например вот так:
"abc" =~ /a/;
my $x = $&;
{
"xyz" =~ /y/;
print "$x vs $&"; # -> a vs y
}
print "Конец строки: $'" # -> Конец строки: bc
Если кто-то знает как сохранить все эти переменные в хеш кратко - напишите в комментариях: буду признателен. Я придумал сделать это только так:
"abc" =~ /(a)/;
%x = map {$_ => $$_} qw/& 1 ' `/;
use DDP; p %x;

# ->
{
& "a",
` ""
' "bc",
1 "a"
}
Так же не следует забывать о том, что переменная $_ является не локальной, а суперглобальной:
$_ = "abc";
{
$_ = "xyz";
print; # -> xyz
}
print; # -> xyz
И тут придётся использовать local:
$_ = "abc";
{
local $_ = "xyz";
print; # -> xyz
}
print; # -> abc
У меня по этой теме - всё. А вам - удачного программирования.


 
Сверху