Как стать автором
Обновить

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

Время на прочтение1 мин
Количество просмотров1.8K

Когда-то я стал писать на 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

У меня по этой теме - всё. А вам - удачного программирования.

Теги:
Хабы:
Всего голосов 10: ↑9 и ↓1+8
Комментарии20

Публикации