マスタリングPerl (9章 動的サブルーチン)

  • 変数に無名サブルーチン・サブルーチンリファレンスを格納することで、同じコードで振る舞いを変えること(ポリモーフィズム)が可能。
    • 振る舞いを変えるには、if文で分岐する方法とハッシュを利用した方法があるが、ハッシュの方が美しいコードだと思う。
  • 無名サブルーチンを型グロブに格納すると、名前付きで定義したサブルーチンのように使用できる。別のモジュールのサブルーチンを再定義することもできる。
#!/us/bin/perl                                                                                                                                                                
use strict;
use warnings;

package	My::Module;

sub say	{
    print __PACKAGE__, "\n";   # My::Module
}

package	main;

My::Module::say();

# 型グラブへの格納による再定義
*My::Module::say = sub {
    print __PACKAGE__, "\n";   # main (ただし、use warningsしていると"Subroutine My::Module::say redefined at ./sample.pl line 18."と注意される)
};

My::Module::say();
  • シンボリックリファレンスは、文字列名を変数名と解釈する。
#!/us/bin/perl                                                                                                                                

$val = "sym_ref";
${"$val"} = "30";     # "$sym_ref = 30;"と同義
print $sym_ref, "\n"; # 30	
print $$val , "\n";   # 30
  • AutoSplitは、useでモジュールをロードする時にコンパイルするのではなく、サブルーチンが呼び出されたタイミングでコンパイルする。
    • AutoLoaderのAUTOLOADのみをロードし、サブルーチンは__END__の後に定義する。
package My::Module;
use AutoLoader 'AUTOLOAD';
1;

__END__
sub say { ... }