как восстановить глобалы 1, 2, 3 доллара при отладке? - PullRequest
2 голосов
/ 05 августа 2020

Когда я отлаживаю код с помощью регулярных выражений:

m/(.)(.)(.)(.)(.)/;
my $x =  $1;
$DB::single = 1;
my $y =  $2 + $3;

и ставлю точку останова на какой-то строке. Я мог запускать сторонний код. И если этот код использует вызов регулярного выражения, тогда $ 2 и $ 3 будут сломаны.

Есть ли способ восстановить $ 2 и $ 3 до их начальных значений с помощью отладчика, когда я продолжу сценарий? (c команда отладчика)

Ответы [ 2 ]

3 голосов
/ 05 августа 2020

Это происходит автоматически.

$ 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.

0 голосов
/ 05 августа 2020

Можете ли вы указать sh значение в переменной?

m/(.)(.)(.)(.)(.)/;
my ($x, $two, $three) = ($1, $2, $3);
$DB::single = 1;
my $y =  $two + $three;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...