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倍になりました。

Source: https://habr.com/ru/post/J52532/


All Articles