Когда-то я стал писать на 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/
Добавить комментарий