【发布时间】:2018-05-16 06:33:26
【问题描述】:
我有一个正则表达式,它可以捕获字符串的某些部分。我想删除/替换使用 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 来获得所需的结果?
【问题讨论】:
-
您使用的是 Windows,但您不知道如何从
cmd复制输出。您需要右键单击,选择 Select(或 Mark 或其他东西),然后选择并按 Enter 键。或阅读howtogeek.com/howto/windows-vista/…。 -
我建议
/^(\d+)_(\d+)_(\w+)_(\d+)\.xml$/除非您不能信任文件名的格式并且您需要验证它们以及解析信息。