Это происходит автоматически.
$ perl -e'
"abc" =~ /(.)(.)(.)/;
CORE::say "[$1$2$3]";
{
"def" =~ /(.)(.)(.)/;
CORE::say "{$1$2$3}";
}
CORE::say "[$1$2$3]";
'
[abc]
{def}
[abc]
Переменные захвата регулярных выражений неявно восстанавливаются при выходе из области, в которой они были изменены. Когда вы выполняете код из отладчика, переменные захвата регулярных выражений восстанавливаются еще до возврата в отладчик.
$ perl -d -e'
"abc" =~ /(.)(.)(.)/;
CORE::say "[$1$2$3]";
CORE::say "[$1$2$3]";
'
[snip]
main::(-e:2): "abc" =~ /(.)(.)(.)/;
DB<1> s
main::(-e:3): CORE::say "[$1$2$3]";
DB<1> s
[abc]
main::(-e:4): CORE::say "[$1$2$3]";
DB<1> p "{$1$2$3}"
{abc} <-- Values from the program
DB<2> x "def" =~ /(.)(.)(.)/; say "<$1$2$3>";
<def> <-- Changed in called code
0 1
DB<3> p "{$1$2$3}"
{abc} <-- Already restored
DB<4> r
[abc] <-- Code has nothing to worry about
Debugged program terminated. [snip]
DB<4> q
Вы должны быть осторожны при изменении других переменных, таких как $!
. Если отлаживаемый код заботится о значении $!
(например), и вы хотите запустить код, который сбивает $!
, вам необходимо создать резервную копию и восстановить его.
x local $!; clobbering_time();
В это время отладчик защищает $@
, $!
, $^E
, $,
, $/
, $\
и $^W
от затирания самим отладчиком, но не кодом, выполняемым через x
.