/ / Неразрушаващ заместител на променливи за улавяне на регекс, разбити в perl5? - regex, perl, заместване, perl5

Неразрушаващ заместител на променливи за улавяне на регекс, разбити в perl5? - regex, perl, заместване, perl5

Забелязах поведение, което ми изглежда застрашително. Проверено със сигурност на перла 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 определя тези променливи, когато има успешно съвпадение

Така че всяко успешно съвпадение би изчиствало стойностите, не е релевантно, че самото съвпадение на манипулацията е предмет на съвпадение.