2

Perl Subversion pre-commit hookがあります。以前のバージョンの Perl では見られなかった、Perl 5.14 を使用している誰かに謎のエラー メッセージが表示されました。

(in cleanup) Non existant subroutine called Section::File::DESTROY at /home/tftung/svn_repos/hooks/pre-commit-kitchen-sink-hook.pl line 282

最初に私を襲ったのは、 nonexisting のスペルミスでし。少年、その男はまったく綴ることができません! それはほとんど...私のスペルと同じくらい悪いです...ちょっと待ってください...

私のコードの1251行目は、私のAUTOLOADサブルーチンからのものです:

croak qq(Non existant subroutine called $AUTOLOAD);

うん、それはエラー行です。

これは、私が Mac で使用している Perl 5.12 では発生せず、Strawberry と ActiveState の両方のフレーバーで PC にインストールされています。また、Perl 5.8 から 5.10 までの社内 Linux ボックスでは発生しません。

Perl が を呼び出しているようDESTROYで、それが私のAUTOLOADサブルーチンによって検出されています。私のパッケージには存在DESTROYないAUTOLOADサブルーチンであるため、サブルーチンはこのエラー メッセージを表示します。

  • これはバグですか、それとも新しいバージョンの Perl の機能ですか? DESTROY への呼び出しをピックアップする AUTOLOAD はかなり新しい機能のようです。
  • これを修正するにはどうすればよいですか? おそらく正しい答えである私の AUTOLOAD サブルーチンを取り除くことに加えて、私は意味します。このスクリプトをゼロから完全に書き直す予定なので、あまり手を加えたくありません。
    • DESTROY何もしないサブルーチンを書くことができます。
    • AUTOLOADルーチンに への呼び出しを無視させることができますDESTROY

これを処理する最良の方法は何ですか?

4

2 に答える 2

3

これは常に起こっているはずです。過去に発生しなかった場合は、perl にバグがあり、コードと相互作用して DESTROY が呼び出されなかった可能性があります。しかし、5.14 では、設計どおりに動作しています。return if $AUTOLOAD =~ /::DESTROY$/破壊の問題を回避するために、AUTOLOAD サブが何かを行うのはよくあることです。

sub DESTROY { }を介してディスパッチするよりも明示的に指定する方が高速AUTOLOADですが、スーパークラスがあり、そのスーパークラスのいずれかにDESTROYメソッドがある (実行されない) 場合は、これを行うのは間違っています。したがって、何も継承しないクラスであっても、それは悪い習慣だと思います。

于 2013-01-18T20:04:48.837 に答える
0

5.12で発生しました。5.10.1 は私が持っている最も古いもので、そこでも発生しました。

>perl5101-ap1007\bin\perl -wE"sub AUTOLOAD { say $AUTOLOAD; } our $x=bless({});"
main::DESTROY

>perl5121-ap1201\bin\perl -wE"sub AUTOLOAD { say $AUTOLOAD; } our $x=bless({});"
main::DESTROY

>perl5123-ap1204\bin\perl -wE"sub AUTOLOAD { say $AUTOLOAD; } our $x=bless({});"
main::DESTROY

>perl5124-ap1205\bin\perl -wE"sub AUTOLOAD { say $AUTOLOAD; } our $x=bless({});"
main::DESTROY

>perl5140-ap1400\bin\perl -wE"sub AUTOLOAD { say $AUTOLOAD; } our $x=bless({});"
main::DESTROY

>perl5142-ap1402\bin\perl -wE"sub AUTOLOAD { say $AUTOLOAD; } our $x=bless({});"
main::DESTROY

>perl5161-ap1601\bin\perl -wE"sub AUTOLOAD { say $AUTOLOAD; } our $x=bless({});"
main::DESTROY
于 2013-01-18T19:05:07.303 に答える