为什么加载Test :: More消除了我的bug?

时间:2012-11-09 18:49:16

标签: regex perl unit-testing

我正在尝试为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版本。

2 个答案:

答案 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中的旧值