我有以下示例perl脚本:
use warnings;
use strict;
my $cont1 = 'item:test';
my $cont2 = 'item:test';
$cont1 =~ s/item:(.*)/$1/; my $one = $1;
$cont2 =~ s/dtms:(.*)/$1/; my $two = $1;
print "one = $one\ntwo = $two\n";
此脚本exec的结果:
one = test
two = test
问题是在第一次成功的正则表达式匹配后$ 1没有被重置,因为第二个正则表达式实际上是失败的并且应该是空的,而是从前一个匹配中获取$ 1的值。我找到了一个奇怪的解决方法,通过在第一个正则表达式后添加奇数正则表达式来重置$ 1 =
"1" =~ /1/;
现在结果是正确的:
one = test
two =
问题是:这是重置$ 1的最佳做法吗?
答案 0 :(得分:7)
您不能重置$1
。相反,在使用任何捕获变量之前,请始终测试您的正则表达式是否匹配。
my $cont1 = 'item:test';
my $cont2 = 'item:test';
if ($cont1 =~ s/item:(.*)/$1/) {
print "one = $1\n";
}
if ($cont2 =~ s/dtms:(.*)/$1/) {
print "two = $1\n";
}
如果您确实要初始化$one
和$two
,请使用?:
my $one = $cont1 =~ s/item:(.*)/$1/ ? $1 : '';
my $two = $cont2 =~ s/dtms:(.*)/$1/ ? $1 : '';