我有来自用户的以下脚本。在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";
#'
请你提供任何指示。 谢谢你的帮助, 阿希什
答案 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。