2012-12-05 56 views
3

把這個簡單的測試案例:爲什麼不Scalar :: Util和Test ::大多數玩的很好?

#!/usr/bin/env perl 

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

ok(1, 'foo'); 

done_testing(); 

運行這個測試給了我下面的輸出:

原型不匹配:子主:: RefType的:在/用戶無VS($)/奧拉夫/ perl5的/ perlbrew/perls/perl-5.16.2/lib/site_perl/5.16.2/Exporter.pm line 66.

有兩種方法可以擺脫此警告。

  • 我可以使用測試::更多,而不是測試::熱門
  • 我可以使用測試::熱門,但沒有明確導入RefType的

我確定與調用標量::的Util :: reftype(甚至使用另一個模塊),但我在調試這個問題時尋求一些幫助,以便我可以提交適當的錯誤報告,因爲我不確定警告的根源在哪裏。

回答

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

二。在加載前從符號表中刪除reftypeScalar::Util

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

感謝您的支持!使用第二個選項,我得到了「* reftype}的模糊使用,解析爲* reftype」。把它改成BEGIN {* reftype =''}的訣竅。我實際上看不到Test :: Most正在輸出reftype,但這回答了我的直接問題。 – oalders

+0

作爲此腳註,perl -MDevel :: Peek -MTest :: Most -e'Dump(\&reftype)'告訴我罪魁禍首是Test :: Deep – oalders

+0

它從'Test :: Deep'輸出,它動態地從'%Test :: Deep :: constructors'(包含'RefType')的鍵創建一系列構造方法。 – mob

相關問題