sub process { my $node = shift; if (my $reftype = ref($node)) { return process_array($node) if $reftype eq 'ARRAY'; return process_hash($node) if $reftype eq 'HASH'; die "invalid node type: $reftype"; } else { return process_scalar($node); } } process({ 'a' => '1', 'b' => [ '2' ], 'c' => { 'd' => '3' } });