AUTOLOADの適切な使用

すぐに警告したいと思います:この記事はバイソン向けではありませんが、AUTOLOADを使用した一般的なトリックについて説明します。



はじめに





Perlには、未定義のメソッドへの呼び出しを処理する絶好の機会があります。



たとえば、

package Something; our $AUTOLOAD; sub AUTOLOAD { return 'any data'; } sub DESTROY { } package XTest; my $o = new Something(); print $o->dry();
      
      







結果は「任意のデータ」に等しくなります。



短所





この方法の欠点は、実際には1つです。繰り返しの呼び出しでパフォーマンスが低下します。



その場でメソッドを生成





その場でメソッドを生成すると、この動作が修正されます。



 package Something; our $AUTOLOAD; sub AUTOLOAD { my ($self) = @_; my $name = $AUTOLOAD; return if $name =~ /^.*::[AZ]+$/; $name =~ s/^.*:://; # strip fully-qualified portion my $sub = sub { my $self = shift(); return 'any data'; }; no strict 'refs'; *{$AUTOLOAD} = $sub; use strict 'refs'; goto &{$sub}; } package XTest; my $o = new Something(); print $o->dry();
      
      







便利な場所





あらゆる種類のカスタムアクセサーに加えて(可能な場合はClass :: Accessor :: Fastを心からお勧めします)、継承できないオブジェクトのラッパーを書くのに非常に役立ちます(たとえば、ハッシュが必要で、オブジェクトはXSハンドルです)。



性能





Benchmarkパッケージから判断すると、サーバー上でオブジェクトを作成し、不明なメソッドを100回呼び出すと(FreeBSD / x64 / Perl5.8.8)、最初のケースでは1秒あたり最大3400回、2番目のケースでは1秒あたり最大11000回呼び出します。 速度が3倍になりました。



All Articles