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