8

我正在尝试为此错误编写测试。我已经找到了该错误的解决方案;我无法理解的是为什么我的测试在发布之前没有发现错误。

问题归结为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 版。

4

2 回答 2

9

这是版本中的错误。$1是魔法变量,并且版本在检查 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

于 2012-11-09T19:38:11.917 回答
8
perl -Mversion -E 'sub TIESCALAR { bless {} }; sub FETCH { die "HERE" }; tie $foo, __PACKAGE__; say version->new($foo)'

版本有问题,它不能正确调用 get magic,因此永远不会填充 1 美元。如果它在首先加载 Test::More 时有效,那只是因为 $1 中还有一个旧值

于 2012-11-09T19:10:29.893 回答