3

拿这个简单的测试用例:

#!/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 (甚至使用另一个模块),但我正在寻找调试此问题的一些帮助,以便我可以提交适当的错误报告,因为我不确定至于警告的根本原因在哪里。

4

1 回答 1

5

两者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), " ...";

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

    使用 Test::Most;
    开始 { *{reftype} = '' }
    使用 Scalar::Util 'reftype';
于 2012-12-05T21:42:52.703 回答