sub iterate($$) { my ($d, $c) = @_; if(ref $d eq 'ARRAY') { @$d=map{ iterate($_,$c) }@$d; return $d; } if(ref $d eq 'HASH') { while( my ($k,$v) = each %$d ) { $d->{$k}=iterate($v,$c); } return $d; } return $c->($d); }