use無しでどこでも変数をダンプするpackage P;p
perl - Perl6の$variable.perlをPerl5で
[Perl] Dumping variables Everywhere without use() - Bulknews::Subtech - subtech
最初CHECKブロックでできるかなと思っていたのですが、シンボルの解決はCHECKでは遅くてBEGINでやらなきゃいけないようです。外部からあるパッケージにエクスポートしようとしてもBEGIN時にはプログラム全体でどういうパッケージが定義されるか分からないので、各モジュールごとにuseしなきゃいけなくなってしまいます。
まぁそれなら明示的に指定しちゃえばいいんじゃね?というわけで書いてみた。
こういうFoo.pmがあるとき、
package Foo; p "test";
SYNOPSISはこんな感じで、環境変数Pか、モジュールPの引数にsub pをエクスポートしたいパッケージを指定します。
% perl -MP=Foo main.pl --- test % P="Foo" perl -MP main.pl --- test
明示的に指定するのは面倒だし、指定していないパッケージでpが使われるとエラーになるので何とも使えなさ感が溢れています。全パッケージを環境変数Pに指定しちゃえばマシに使える気が・・・しないか。
package P; use strict; use warnings; use YAML; sub import { my ($class, @modules) = @_; push @modules, split /[,\s]+/msx, $ENV{P} || q{}; foreach my $module (@modules) { no strict qw(refs); *{$module.'::p'} = sub { warn YAML::Dump(shift); } }; } 1;