【问题标题】:Why does loading Test::More eliminate my bug?为什么加载 Test::More 会消除我的错误?
【发布时间】:2012-11-10 04:18:08
【问题描述】:

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

问题归结为这个命令行打印Ver: 0,而它应该打印Ver: 1.00

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

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

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

我正在使用 Perl 5.14.2、Test::More 0.98 和 0.88 版。

【问题讨论】:

    标签: regex perl unit-testing


    【解决方案1】:

    这是版本中的错误。 $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

    【讨论】:

    • 好的,所以我花了一段时间才确定。该死的,莱昂! ;)
    • Leon 更快,但我更喜欢你的答案(+错误报告),所以我接受你的。
    【解决方案2】:
    perl -Mversion -E 'sub TIESCALAR { bless {} }; sub FETCH { die "HERE" }; tie $foo, __PACKAGE__; say version->new($foo)'
    

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

    【讨论】:

      猜你喜欢
      • 2022-12-20
      • 2015-01-25
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 2018-01-22
      • 2017-08-26
      • 2020-07-12
      • 1970-01-01
      相关资源
      最近更新 更多