8

このバグのテストを書こうとしています。私はすでにバグの解決策を見つけました。理解できないのは、リリース前にテストでバグが検出されなかった理由です。

問題は、印刷Ver: 0するはずのときに、このコマンドラインの印刷に要約されますVer: 1.00

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

ただし、 の-MTest::More-Mversionに挿入すると、 が出力されVer: 1.00ます。

私の質問は、Test::Moreをロードするとコードの動作が変わるのはなぜですか? (ボーナス ポイントについては、バグをなくす"$1"代わりに使用するのはなぜですか?)$1

Perl 5.14.2、Test::More 0.98、およびバージョン 0.88 を使用しています。

4

2 に答える 2

9

バージョンのバグです。$1はマジカル var であり、バージョンは引数が定義されているかどうかを確認する前にマジックの処理に失敗します。$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

バグレポートを提出しました: Perl RT#115660

于 2012-11-09T19:38:11.917 に答える
8
perl -Mversion -E 'sub TIESCALAR { bless {} }; sub FETCH { die "HERE" }; tie $foo, __PACKAGE__; say version->new($foo)'

バージョンにはバグがあり、get Magic を適切に呼び出さないため、$1 が読み込まれません。最初に Test::More をロードするときに機能する場合、それは $1 にまだ古い値が残っているためです。

于 2012-11-09T19:10:29.893 に答える