2011-11-11 2 views
3

以下のスクリプトがあります。 perl 5.8.4と5.12.4を実行すると、1が出力されますが、5.10.0では出力されません(0が出力されます)。5.8.4と5.12.4で動作するPerlスクリプトですが、5.10.0では動作しません

perl -e ' my $a=0; my $net="<*2>ColBnk<2"; if (($net =~ s/([(<])/$1/g) != ($net =~ s/([>)])/$1/g)){$a++} print $a;' 

これはコード(!=の代わりneで文字列変数を比較するか、これは$a++後にセミコロンが欠落しているが原因である可能性)の問題です。 ($net =~ s/([(<])/$1/g)と($net =~ s/([>)])/$1/g)という値を出力してデバッグしようとしましたが、両方とも同じ値を出力しています。以下のコードを参考にしてください

use strict; 
use warnings; 


#/mu/bin/perl -e ' 
my $a=0; 
my $net="<*2>ColBnk<2"; 

my $test="<*2>ColBnk<2"; 
$test =~ s/([(<])/$1/g; 
print "\n$test" ; 
$test =~ s/([>)])/$1/g; 
print "\n$test" ; 

if (($net =~ s/([(<])/$1/g) ne ($net =~ s/([>)])/$1/g)){$a++;} 

print "\n Value of a =$a"; 

#' 

あなたは何か指摘してください。 助けてくれてありがとう Ashish

答えて

8

5.8.9と5.14.2で動作することが確認できますが、5.10.0では動作しません。それは5.8と5.10の間のどこかに導入され、続いて修正されたバグでなければなりません。私はPorting/bisect.plを使ってどこが壊れているかを調べました。これはPerl 5.9.4で導入されたthis commitでした。それはPerl 5.10.1で導入されたthis commitで修正されました。

bisect.plを使ってみたところ、Cコンパイラをインストールする必要があるというエラーが出ていました。 bisect.plはPerlのConfigureスクリプトの通常のコンパイラ検出(おそらく時間を節約するため)を使用しないことが判明しました。デフォルトが機能しない場合は、bisect.plの-Dオプションを使用して設定する必要があります。 (例えば、-D{cc,ld}=/usr/bin/gccを使用しました)。各s///gの結果を格納することによって、あなたがたPerl 5.10.0を使用する必要がある場合

$ git clone git://perl5.git.perl.org/perl.git 
$ mkdir perl-bisect 
$ cd perl 
$ cp -a Porting/bisect* ../perl-bisect/ 
$ ../perl-bisect/bisect.pl --target=miniperl --end=v5.10.0 --start=perl-5.8.4 \ 
    -e 'my $a=0; my $net="<*2>ColBnk<2"; if (($net =~ s/([(<])/$1/g) != ($net =~ s/([>)])/$1/g)){$a++} die unless $a;' 

は、その後、あなたがバグを回避することができます

次の手順を実行して、バグを導入し、正確な変更を見つけることができます

perl -e 'my $a=0; my $net="<*2>ColBnk<2"; my $x = ($net =~ s/([(<])/$1/g); my $y = ($net =~ s/([>)])/$1/g); if ($x != $y){$a++} print $a;' 

をしかし、よりよい解決策は、固定されたバージョンにアップグレードすることです:一時変数にして、2つの変数を比較します。 Perl 5.10は公式に廃止されましたが、大きな変更を加えたくない場合は、 5.10.1をインストールすることができます。または、5.12または5.14にアップグレードすることもできます。

+0

ご協力いただきありがとうございます。今のところ回避策を使用します:-) – CppLearner

関連する問題