どちらも残念ながら不完全。
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;pRuby の 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
package P;
use YAML;
sub _ {YAML::Dump(shift);};
1;