use strict; my @result; my @a = (1, 2, [3, [4, 5]], 6, [7, 8, [9,10], [11, 12]], {1=>13, 2=>{2=> 14}}); de_ref(\@result, \@a); print(join(",",@result));#expect 1,2,3,4,5,6,7,8,9,10,11,12,13,14 sub de_ref { my ($result, $source) = @_; if (!ref($source)) { push @{$result}, $source; } else { if (ref($source) eq "ARRAY") { foreach my $ele (@{$source}) { de_ref($result, $ele); } } elsif (ref $source eq "HASH") { foreach my $ele (values %{$source}) { de_ref($result, $ele); } } elsif (ref $source eq "SCALAR") { push @{$result}, $$source; } } }