どちらも残念ながら不完全。

CLON - 2006/10/07
あ、UNIVERSAL::pにすればいいんじゃね。
subtechグループ - Bulknews::Subtech - [Perl] Dumping variables Everywhere without use()
package P; use strict; use YAML; *CORE::GLOBAL::dump = sub { warn YAML::Dump(@_); }; 1;

前者は$obj->pはよくてもp { foo => 1 }(Unblessed reference)が駄目で、後者はその逆。あとbuiltinされていないものにはこの手が使えず。

naoyaグループ - naoyaの日記 - use P;p
Ruby の p により近い使用感が欲しかったってことだよね。

というわけで、一挙両得の秘技を以下に。

package P;
use 5.008001;
use strict;
use warnings;
use YAML ();

sub import{
    no strict 'refs';
    *{ caller() . '::p'} = *UNIVERSAL::p = sub{
        return YAML::Dump(shift);
    };
}

1;
% perl -MP -MCGI -le 'print CGI->new->p'
--- !!perl/hash:CGI
.charset: ISO-8859-1
.fieldnames: {}
.parameters: []
escape: 1

% perl -MP -MCGI -le 'print p [ @INC ]'
---
- /usr/local/lib/perl5/5.8.8/darwin-thread-multi-2level
- /usr/local/lib/perl5/5.8.8
- /usr/local/lib/perl5/site_perl/5.8.8/darwin-thread-multi-2level
- /usr/local/lib/perl5/site_perl/5.8.8
- /usr/local/lib/perl5/site_perl
- .

もっとも、これらはPerl 6だと$whatever.perlがあるので不要になるのだけど。

以下、Perl6::perlのQuick & Dirtyな実装。一応ちゃんとeval()できるようにData::DumperでSerializeしています。

ackage Perl6::perl;
use 5.008001;
use strict;
use warnings;
use Data::Dumper ();

sub import{
    no strict 'refs';
    *{ caller() . '::perl'} = *UNIVERSAL::p = \&perl;
}

sub perl{
    my $dumper = Data::Dumper->new([ shift ]);
    $dumper->Terse(1);
    if (@_){ # handle D::D options
        my %opt = @_;
        for my $key (keys %opt){
            $dumper->$key($opt{$key});
        }
    }
    return $dumper->Dump;
}

1;

でもUNIVERSAL::使うのをCPANizeすると怒る人多いんだよなあ....UNIVERSAL::requireですらいい顔しない人もいるし。というわけで、Use @ Your Own Riskっちゅうことで。

Enjoy!

Dan the Just Another Perl (?:Ab)?user