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

cjm*_*cjm 8 regex perl unit-testing

我正在尝试为这个bug写一个测试.我已经找到了这个bug的解决方案; 我无法理解的是为什么我的测试在发布之前没有发现错误.

Ver: 0当打印时,问题可归结为此命令行打印Ver: 1.00:

perl -Mversion -e 'printf "Ver: %s\n", ("v1.00" =~ /v(.+)/ ? version->parse($1) : "no");'
Run Code Online (Sandbox Code Playgroud)

但是,如果您-MTest::More之前插入-Mversion,则打印Ver: 1.00.

所以我的问题是为什么加载Test :: More会改变我的代码的行为?(对于奖励积分,为什么使用"$1"而不是$1消除错误?)

我正在使用Perl 5.14.2,Test :: More 0.98和0.88版本.

ike*_*ami 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
Run Code Online (Sandbox Code Playgroud)

我已经提交了一份错误报告:Perl RT#115660


Leo*_*ans 8

perl -Mversion -E 'sub TIESCALAR { bless {} }; sub FETCH { die "HERE" }; tie $foo, __PACKAGE__; say version->new($foo)'
Run Code Online (Sandbox Code Playgroud)

版本是错误的,它不会正确调用get magic,因此永远不会填充1美元.如果它在加载Test :: More时有效,那只是因为$ 1中仍然存在旧值