終了処理が必要かどうかを判定する
この手のモダンなDevel系モジュールで比較的用途がわかりやすいものとしては,
スコープの最後に特殊な処理をしたいときは
Bの世界はDevel以上にPerl内部に密着した逸般人向けのものですが,
スコープのコンパイルが終了したとき,
また,
型グロブやno strictを見せない工夫
Devel系やB系に比べると,
たとえば,
モダンPerlの世界ではとかくuse strictやuse warnings
use strict;
use warnings;
{ # 例外的な処理はせめてブロックの中に閉じこめましょう
no strict 'refs';
no warnings 'redefine';
*{$package_name.'::'.$method_name} = sub { ... };
}
これはコードも汚くなりますし,
use strict;
use warnings;
use Sub::Install qw( reinstall_sub );
# もう no strict 'refs' は見えません
reinstall_sub({
into => $package_name,
as => $method_name,
code => sub { ... },
});
Sub::Exporterの場合は一手間かかりますが,
package MyClass;
use strict;
use warnings;
use Sub::Exporter -setup => {
exports => [
method_name => sub { return sub { ... } },
],
};
1;
のような形にして,
use strict;
use warnings;
use MyClass qw( method_name );
# これで __PACKAGE__->method_name() のようなコードが利用できます。
無名関数に名前を付ける
2004年リリースのSub::Nameを使うと,
#!perl
use strict;
use warnings;
use Carp;
use Sub::Name;
my $anon = sub { carp "__ANON__" };
$anon->();
my $named = subname "anonymous", sub { carp "anonymous" };
$named->();
このように無名関数がひとつだけの場合はあまりありがたみがありませんが,
関数リファレンスの元の名前を調べる
逆に,
use strict;
use warnings;
use Sub::Name;
use Sub::Identify ':all';
print sub_name(\&method), "\n"; # method
print sub_name(subname "foo", sub { return }), "\n"; # foo
sub method { return }
汚い部分を隠して読みやすく
Perlのコードは記号が多くて読みづらいとか,
依存モジュールが増えると再配布がやや面倒になる,