【问题标题】:Why don't Scalar::Util and Test::Most play well together?为什么 Scalar::Util 和 Test::Most 不能很好地配合使用?
【发布时间】:2012-12-05 21:20:32
【问题描述】:

拿这个简单的测试用例:

#!/usr/bin/env perl

use Test::Most;
use Scalar::Util qw( reftype );

ok( 1, 'foo' );

done_testing();

运行这个测试会给我以下输出:

原型不匹配:sub main::reftype: none vs ($) at /Users/olaf/perl5/perlbrew/perls/perl-5.16.2/lib/site_perl/5.16.2/Exporter.pm 第 66 行。

有两种方法可以消除此警告。

  • 我可以使用 Test::More 而不是 Test::Most
  • 我可以使用 Test::Most 但不是显式导入 reftype

我可以调用 Scalar::Util::reftype (甚至使用另一个模块),但我正在寻求一些帮助来调试这个问题,以便我可以提交适当的错误报告,因为我'我不确定警告的根本原因在哪里。

【问题讨论】:

    标签: perl


    【解决方案1】:

    Test::MostScalar::Util 都定义了称为reftype 的函数,而您调用use 的方式会导致两个模块都尝试将它们的reftype 函数导出到调用包。有时这会触发Subroutine ... redefined 警告,但在这种情况下Scalar::Util::reftype 想用原型定义自己,所以冲突是一个更严重的错误。

    调用Scalar::Util::reftype($ref)以外的一些选项:

    一个。为Scalar::Util::reftype定义和使用不同的别名

    使用标量::Util (); 开始 { *su_reftype = *Scalar::Util::reftype; } print "reftype is ", su_reftype($ref), " ...";

    两个。在加载Scalar::Util之前从符号表中删除reftype

    使用 Test::Most; 开始 { *{reftype} = '' } 使用 Scalar::Util 'reftype';

    【讨论】:

    • 谢谢!使用您的第二个选项,我得到“将 *{reftype} 的歧义使用解析为 *reftype”。将其更改为 BEGIN { *reftype = '' } 就可以了。我实际上看不到 Test::Most 在哪里导出 reftype,但这回答了我的直接问题。
    • 作为脚注,perl -MDevel::Peek -MTest::Most -e'Dump(\&reftype)' 告诉我罪魁祸首是 Test::Deep
    • 它是从Test::Deep导出的,它从%Test::Deep::constructors(包括RefType)的keys中动态创建一系列构造方法。
    • 你肯定想像往常一样在编译时导入它,所以我调整了节点。
    猜你喜欢
    • 1970-01-01
    • 2014-07-04
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 2011-02-27
    • 2010-09-09
    相关资源
    最近更新 更多