Забелязах поведение, което ми изглежда застрашително. Проверено със сигурност на перла 5.18 и perl 5.22.
Една опростена единична линия, за да илюстрираме.
$ echo -e "A B C Dn# E F G" | perl -wnE "m{(.) (.) (.) (.)}; say($1,$2,$3,$4); say "HELLO $1 " . ($1 =~ s/w/###/r) ." $2 $3 $4""
ABCD
Use of uninitialized value $2 in concatenation (.) or string at -e line 1, <> line 1.
Use of uninitialized value $3 in concatenation (.) or string at -e line 1, <> line 1.
Use of uninitialized value $4 in concatenation (.) or string at -e line 1, <> line 1.
HELLO A ###
#EFG
HELLO # # E F G
Очевидно наричаме неразрушителна замянавърху която и да е променлива, свързана с улавянето, недефинира или по някакъв начин възпрепятства достъпа до всички предварително дефинирани свързани с улавянето променливи. Същото нещо, когато използвате имена улавя и %+
хашиш.
Това ми изглежда като бъг, но не знам дали ми липсва нещо.
Благодаря предварително.
Отговори:
2 за отговор № 1виждам perlvar:
Perl определя тези променливи, когато има успешно съвпадение
Така че всяко успешно съвпадение би изчиствало стойностите, не е релевантно, че самото съвпадение на манипулацията е предмет на съвпадение.