sub { "DUMMY" } にウンザリして,しばらく前から Data::Dumper に以下のようなパッチを当てている。これで,コードリファレンスが与えられたときにその名前を出力するようになる。Deparse よりも簡潔でいい。無名関数に対してはあまり効果がないが,&foo::__ANON__ だってパッケージの情報がある分 sub{ "DUMMY"} よりはマシだ。
To Dumper.pm:
--- a/Dumper.pm~ +++ b/Dumper.pm @@ -456,7 +456,10 @@ sub _dump { $sub =~ s/\n/$pad/gse; $out .= $sub; } else { - $out .= 'sub { "DUMMY" }'; + require B; + my $cv = B::svref_2object($val); + $out .= '\&' . join('::', $cv->GV->STASH->NAME, $cv->GV->NAME); carp "Encountered CODE ref, using dummy placeholder" if $s->{purity}; } }
To Dumper.xs:
--- a/Dumper.xs~ +++ b/Dumper.xs @@ -805,7 +805,9 @@ DD_dump(pTHX_ SV *val, const char *name, STRLEN namelen, SV *retval, HV * SvREFCNT_dec(totpad); } else if (realtype == SVt_PVCV) { - sv_catpvn(retval, "sub { \"DUMMY\" }", 15); + CV* const code = (CV*)SvRV(val); + sv_catpvf(retval, "\\&%s::%s", HvNAME(GvSTASH(CvGV(code))), GvNAME(CvGV(code))); if (purity) warn("Encountered CODE ref, using dummy placeholder"); }