Perl脚本适用于5.8.4和5.12.4但不适用于5.10.0

时间:2011-11-11 07:19:31

标签: perl

我有来自用户的以下脚本。在perl 5.8.4和5.12.4上运行时,它打印1,但不打印在5.10.0(打印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";

 #'

请你提供任何指示。 谢谢你的帮助, 阿希什

1 个答案:

答案 0 :(得分:8)

我可以确认它在5.8.9和5.14.2中有效,但在5.10.0中不起作用。它必须是介于5.8和5.10之间的错误,然后修复。我用Porting / bisect.pl来找出它破坏的地方。它是this commit,它是在Perl 5.9.4中引入的。然后由this commit修复,这是在Perl 5.10.1中引入的。

当我尝试使用bisect.pl时,我不断收到有关需要使用C编译器的错误(即使我安装了一个C编译器)。事实证明,bisect.pl不使用Perl配置脚本的正常编译器检测(可能是为了节省时间)。如果默认设置不起作用,则需要使用bisect.pl的-D选项进行设置。 (例如,我使用了-D{cc,ld}=/usr/bin/gcc)。

您可以通过执行以下步骤找到引入错误的确切更改:

$ 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 5.10.0,那么你可以通过将每个s///g的结果存储到一个临时变量中来解决这个问题,然后比较这两个变量:

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;'

但更好的解决方案是升级到固定版本。 Perl 5.10正式终止,但如果您不想进行大的更改,可以安装5.10.1。或者您可以升级到5.12或5.14。