2012-11-09 33 views
8

我想爲this bug寫一個測試。我已經找到了解決方案,我無法理解的是爲什麼我的測試在發佈之前沒有發現bug。爲什麼加載Test :: More可以消除我的錯誤?

的問題歸結爲這個命令行打印Ver: 0當它應該打印Ver: 1.00

perl -Mversion -e 'printf "Ver: %s\n", ("v1.00" =~ /v(.+)/ ? version->parse($1) : "no");' 

但是,如果你-Mversion之前插入-MTest::More,然後它打印Ver: 1.00

所以我的問題是爲什麼加載Test::More改變我的代碼的行爲? (對於獎勵積分,爲什麼使用"$1"而不是$1消除該錯誤?)

我使用Perl 5.14.2,測試::更多0.98和版本0.88。

回答

8

這是版本中的一個錯誤。 $1是不可思議的變種,並且版本在檢查arg是否被定義之前未能處理魔術。它認爲$1是不確定的,如果沒有人從$1讀取。如果有人已經從$1(例如Test :: More)讀取,那麼它看起來定義爲版本。

$ perl -Mversion -E' 
    "v1.00" =~ /v(.+)/ or die; 
    $x=$1 if $ARGV[0]; 
    say version->parse($1); 
' 0 
0 

$ perl -Mversion -E' 
    "v1.00" =~ /v(.+)/ or die; 
    $x=$1 if $ARGV[0]; 
    say version->parse($1); 
' 1 
1.00 

我已經提交了一份bug報告:Perl RT#115660

+0

OK,所以我花了一段時間來確定。該死的,萊昂! ;) – ikegami

+0

Leon的速度更快,但我更喜歡你的答案(+錯誤報告),所以我接受你的答案。 – cjm

8
perl -Mversion -E 'sub TIESCALAR { bless {} }; sub FETCH { die "HERE" }; tie $foo, __PACKAGE__; say version->new($foo)' 

版本是越野車,它不會調用正確的魔法,因此從不填充$ 1。如果它在第一次加載Test :: More的時候起作用,那僅僅是因爲在$ 1中仍然存在舊值。

相關問題