foreach my $r (@array){ my @big; walk(\@big, $r); ... } sub walk { my $big = shift; my $i = shift; push @$big, $i; for (@{$hash{$i}}){ walk($big, $_) } }