Perl: странное поведение s /// g - PullRequest
0 голосов
/ 15 мая 2018

У меня есть регулярное выражение, которое захватывает некоторые части строки.Я хочу удалить / заменить какой-либо символ одной из захваченных строк, используя 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, чтобы получить желаемый результат?

1 Ответ

0 голосов
/ 15 мая 2018

m// и s/// устанавливают переменные совпадения после успешного сопоставления, в то время как tr/// нет, поскольку это просто посимвольное преобразование. Использование s/// здесь просто отбрасывает предыдущие значения $1, $2 и т. Д. потому что вы делаете еще один матч. Просто свяжите их с различными переменными перед их использованием.

my $x = '01_02_john_jane_fred_2017.xml';
$x =~ /^(\d\d)_(\d\d)_((?:[a-z]+_?)+)_(\d{4})\.xml$/;

my $first = $1;
my $second = $2;
my $desc = $3;
my $year = $4;
$desc =~ s/_//g;

print "---print \$first: $first\n";
print "---print \$second: $second\n";
# ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...