sub GetData { my %data; sub Recursive { # do stuff # push onto %data # call Recursive if appropriate } Recursive(); return \%data; } my %data = %{GetData()}; # Can this be cleaner?