我正在尝试为this bug编写测试。我已经找到了这个bug的解决方案;我无法理解的是为什么我的测试在发布之前没有发现错误。
当问题打印Ver: 0
时,问题归结为此命令行打印Ver: 1.00
:
perl -Mversion -e 'printf "Ver: %s\n", ("v1.00" =~ /v(.+)/ ? version->parse($1) : "no");'
但是,如果您在-MTest::More
之前插入-Mversion
,则会打印Ver: 1.00
。
所以我的问题是为什么加载Test::More会改变我的代码的行为? (对于奖励积分,为什么使用"$1"
代替$1
来消除错误?)
我正在使用Perl 5.14.2,Test :: More 0.98和0.88版本。
答案 0 :(得分:9)
这是版本中的错误。 $1
是神奇的var,在检查arg是否已定义之前,版本无法处理魔法。如果没有人从$1
读过,它认为$1
是未定义的。如果有人从$1
读取(例如Test :: More),那么它似乎已定义为版本。
$ perl -Mversion -E'
"v1.00" =~ /v(.+)/ or die;
$x=$1 if $ARGV[0];
say version->parse($1);
' 0
0
$ perl -Mversion -E'
"v1.00" =~ /v(.+)/ or die;
$x=$1 if $ARGV[0];
say version->parse($1);
' 1
1.00
我已提交错误报告:Perl RT#115660
答案 1 :(得分:8)
perl -Mversion -E 'sub TIESCALAR { bless {} }; sub FETCH { die "HERE" }; tie $foo, __PACKAGE__; say version->new($foo)'
版本有缺陷,它没有正确调用魔法,因此永远不会填充$ 1。如果它在加载Test :: More时起作用,那只是因为它仍然是$ 1中的旧值