sub walk(&@) { my ($cb, $rez) = @_; for my $host ( keys %$rez ) { for my $tgt ( keys %{ $rez->{$host}{tgt} } ) { for my $dev ( keys %{ $rez->{$host}{tgt}{$tgt} } ) { $cb->($tgt, $dev, $rez->{$host}{tgt}{$tgt}{$dev}); }}} } walk { my ($tgt, $dev, $val) = @_; ... } \%rez;