正则表达式$ 1变量重置

时间:2014-03-26 05:40:02

标签: regex perl

我有以下示例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的最佳做法吗?

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 : '';