为什么Scalar :: Util和Test :: Most一起玩得不好?

时间:2012-12-05 21:20:33

标签: perl

采用这个简单的测试用例:

#!/usr/bin/env perl

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

ok( 1, 'foo' );

done_testing();

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

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

我有两种方法可以摆脱这种警告。

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

我可以调用Scalar :: Util :: reftype(甚至使用其他模块),但我正在寻找一些帮助调试此问题,以便我可以提交相应的错误报告,因为我'我不确定警告的根本原因在哪里。

1 个答案:

答案 0 :(得分:4)

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

除了致电Scalar::Util::reftype($ref)以外的其他选项:

一。为Scalar::Util::reftype

定义和使用不同的别名
     use Scalar::Util ();
     BEGIN { *su_reftype = *Scalar::Util::reftype; }
     print "reftype is ", su_reftype($ref), " ...";

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

    use Test::Most;
    BEGIN { *{reftype} = '' }
    use Scalar::Util 'reftype';