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

от автора

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

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


ссылка на оригинал статьи https://habr.com/ru/articles/583710/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *