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 条件が true であり、$1 は正しい "THOR.Thunder.Client" として出力されます。しかし、置換に関しては、私には理解できない奇妙なことが起こっています。print ステートメント 1 では、$1 は「THOR.Thunder.Client」ですが、Print ステートメント 2 では空です。私はそれが同じ値を持つことを期待します。

ただし、「CF.Thunder.Client.API.Conversion.dll」の 2 文字を削除して d2 の長さを短くすると、正しい結果が得られます。つまり、print ステートメント 2 の $1 に必要な値が含まれています。

なぜこれが起こっているのか誰か説明してもらえますか?

4

1 に答える 1

1

なぜそれが起こっているのかを正確に説明することはできませんが、検索パターンが固定されているにもかかわらず、グローバル置換を実行しようとしているという事実に関連しているようです. これは、perl v5.8.8 である種の微妙なバグを引き起こしているようです。perl v5.10.1 の同じコードは期待どおりに動作します (ただし、$with 内の $1 はどちらのバージョンでも置換で展開されません)。

私はこれをめったに現れない perl バグと呼んでいますが、それを引き起こす状況の正確な組み合わせを見つけることができました。

于 2013-09-23T06:55:46.440 に答える