在进行正则表达式给出不正确的值后,模式匹配变量($ 1)

时间:2013-09-23 05:59:34

标签: regex perl

我今天正在运行一个perl脚本并且遇到了问题。我已经确定了潜在的有问题的代码,但不确定问题到底是什么。

以下是重现问题的代码。

use Strict;

my $d1 = "development/source/Utils/THOR.Thunder.Client/Release/THOR.Thunder.pdb";
my $d2 = "development/source/Utils/THOR.Thunder.Client/Release/CF.Thunder.Client.API.Conversion.dll";
my $search = '^development/source/Utils/([^\\\\\/]+)/(install|Release)/';
my $with = '$1/';
print "$d1\n$d2\n$search\n$with\n\n";

if ($d1 =~ m/$search/)
{
print "Yippie 1 $1\n";
}

if ($d2 =~ m/$search/)
{
print "Yippie 2 $1\n";
}


$d1 =~ s/$search/$with/gi;
print("The value of 1 is $1\n"); #Print statement 1
$d2 =~ s/$search/$with/gi;
print("The value of 1 is $1"); #Print statement 2

在上面的代码中,if条件都为真,$ 1打印为“THOR.Thunder.Client”,这是正确的。然而,当谈到替换时,我发现一些奇怪的事情,我无法理解。在print statement 1中,$ 1是“THOR.Thunder.Client”但是在Print语句2中它是空的。我希望它具有相同的价值。

如果我通过删除“CF.Thunder.Client.API.Conversion.dll”中的任何2个字符来减少d2的长度,我得到正确的结果,即打印语句2中的$ 1具有我想要的值。

任何人都可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

我无法准确解释它为什么会发生,但它似乎与你试图进行全局替换的事实有关,即使搜索模式已经锚定。似乎这会在perl v5.8.8中触发某种微妙的错误。 perl v5.10.1中的相同代码按预期工作(尽管在任一版本的替换中$ $内部的$ 1都没有扩展)。

我会称这是一个很少出现的perl bug,但你设法找到了触发它的确切情况组合。