У меня есть регулярное выражение, которое захватывает некоторые части строки.Я хочу удалить / заменить какой-либо символ одной из захваченных строк, используя s /// g, но это странное поведение.С tr /// d это дает желаемый результат.
Сначала здесь вывод того, что я хочу, используя код с tr:
use strict;
use warnings;
my $x = '01_02_john_jane_fred_2017.xml';
$x =~ /^(\d\d)_(\d\d)_((?:[a-z]+_?)+)_(\d{4})\.xml$/;
my $desc = $3;
$desc =~ tr/_//d;
print "---print \$1: $1\n";
print "---print \$2: $2\n";
print "---print \$3: $3\n";
print "---print \$desc: $desc\n";
print "---print \$4: $4\n";
Это то, что я получаю:
D:\>perl p0018.pl
---print $1: 01
---print $2: 02
---print $3: john_jane_fred
---print $desc: johnjanefred
---print $4: 2017
Но если я использую s /// g вместо tr /// d:
$desc =~ s/_//g;
, я получу это:
D:\>perl p0018.pl
Use of uninitialized value $1 in concatenation (.) or string at p0018.pl line 14.
---print $1:
Use of uninitialized value $2 in concatenation (.) or string at p0018.pl line 15.
---print $2:
Use of uninitialized value $3 in concatenation (.) or string at p0018.pl line 16.
---print $3:
---print $desc: johnjanefred
Use of uninitialized value $4 in concatenation (.) or string at p0018.pl line 18.
---print $4:
Есть ли объяснение дляэто поведение?Как я мог использовать s вместо tr, чтобы получить желаемый результат?