Perl 5.16.0 RC0 がでたので __SUB__ をつかいこなしてみた。
http://d.hatena.ne.jp/fbis/20090610/1244604865
にあるような、Data::Visitor::Callback をつかうような visitor を、簡単に無名関数で実装することができます。
use 5.16.0;
my $rh_testdata = {
'a' => 1,
'b' => {
'aa' => 1,
'ab' => [ 1, 2, 3, \ 'test', 5 ],
'ac' => 3,
},
'c' => 3,
'd' => 4,
'e' => 5,
};
use Scalar::Util qw(blessed);
sub {
if (blessed $_[0]) {
return $_[0];
} else {
my $ref = ref $_[0];
if ($ref) {
given ($ref) {
when ('ARRAY') {
for (@{$_[0]}) {
$_ = __SUB__->($_);
}
return $_[0];
}
when ('HASH') {
while (my ($k, $v) = each %{$_[0]}) {
$_[0]->{$k} = __SUB__->($_[0]->{$k});
}
return $_[0];
}
when ('REGEXP') {
return $_[0];
}
when ('SCALAR') {
return $_[0];
# return \(__SUB__->(${$_[0]}));
}
}
} else {
return 'cooked ' . $_[0];
}
}
}->($rh_testdata);
say Dumper($rh_testdata);
Published: 2012-05-11(Fri) 05:47