3

perl 5.8 で

perl  -e ' print "a" if AXXXXXXXXXXXXX::->can("isa");'
perl  -e ' print "a" if AXXXXXXXXXXXXX->can("isa");'

print "nothing" は、メソッド テストが失敗したことを意味します。

perl 5.17 で

perl  -e ' print "a" if AXXXXXXXXXXXXX::->can("isa");'
perl  -e ' print "a" if AXXXXXXXXXXXXX->can("isa");'

print "a" は、メソッドのテストが成功したことを意味します。

私はなぜ違いを知りたいですか?

また、新しいバージョンの perl で、esixt およびアンロードされたモジュール「AXXXXXXXXX」テストがパスするのはなぜですか?

とてもありがとう:)

4

2 に答える 2

5

perldoc perl5180deltaから:

"$class->can"、"$class->isa"、および "$class->DOES" は、$class によって参照されるパッケージが存在するかどうかに関係なく、正しい結果を返すようになりました [perl #47113]。

この変更は、 に関する未解決のバグ レポートを修正するために導入されましたUNIVERSAL::can。この変更は間違いなく互換性のない動作の変更をもたらしますが、既存の議論に基づいて、動作の変更はバグとは見なされず、元に戻される可能性は低いです。

perl #47113には、元のバグ レポートと最近の修正が記載されています。

perl #118513は、あなたが観察した動作を報告するバグです -- 拒否されたためクローズされました

質問のコード例でやろうとしていることを達成するための別の手段がある可能性が非常に高いです。あなたが達成しようとしていることを検索することをお勧めします。

特定のモジュールがロードされているかどうかをテストしようとしている場合は、この変更に対応してParams::Validate::Dependencies で採用されているアプローチに似たものを使用できます。

no strict 'refs'
unless(@{"${class}::ISA"}) [...]

別の方法がある可能性があります。もう一度、Perl へのこの変更について知ったので、達成しようとしていることを検索してください。

于 2013-06-27T06:31:41.003 に答える
1

canバギーでした。報告されているようにcan、一部のモジュールの名前空間にメソッド名がなかったことを報告しますisa

>perl5.16.3 -E"say 'xxx'->can('isa') ? q{can} : q{can't}"
can't

しかし、すべての名前空間にはそのようなメソッドがあります。

>perl5.16.3 -E"say eval { 'xxx'->isa('yyy'); 1 } ? q{can} : q{can't}"
can

これは5.18.0で修正されました。

于 2013-06-27T10:49:31.627 に答える