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;