采用这个简单的测试用例:
#!/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>
我有两种方法可以摆脱这种警告。
我可以调用Scalar :: Util :: reftype(甚至使用其他模块),但我正在寻找一些帮助调试此问题,以便我可以提交相应的错误报告,因为我'我不确定警告的根本原因在哪里。
答案 0 :(得分:4)
Test::Most
和Scalar::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';