我今天正在运行一个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具有我想要的值。
任何人都可以解释为什么会这样吗?
答案 0 :(得分:1)
我无法准确解释它为什么会发生,但它似乎与你试图进行全局替换的事实有关,即使搜索模式已经锚定。似乎这会在perl v5.8.8中触发某种微妙的错误。 perl v5.10.1中的相同代码按预期工作(尽管在任一版本的替换中$ $内部的$ 1都没有扩展)。
我会称这是一个很少出现的perl bug,但你设法找到了触发它的确切情况组合。