0

我今天正在运行一个 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”,这是正确的。然而,当谈到替换时,发生了一些我无法理解的奇怪事情。在打印语句 1 中,$1 是“THOR.Thunder.Client”,但在打印语句 2 中它是空的。我希望它具有相同的价值。

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

有人可以解释为什么会这样吗?

4

1 回答 1

1

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

我认为这是一个很少出现的 perl 错误,但您设法找到了触发它的确切环境组合。

于 2013-09-23T06:55:46.440 回答