use strict; use warnings; sub analyse_user_inputs { my $hash_ref = shift @_; my @the_inputs; foreach ( keys %{$hash_ref} ) { push @the_inputs, $_; if (ref $hash_ref->{$_} eq 'HASH') { push @the_inputs, @{ analyse_user_inputs($hash_ref->{$_}) }; } elsif (ref $hash_ref->{$_} eq 'ARRAY') { foreach my $array_element (@{$hash_ref->{$_}}){ push @the_inputs, @{ analyse_user_inputs($array_element) }; } } } return(\@the_inputs); } my $data = { foo => 1, bar => [ { xyzzy => 'magic', } ], baz => { quux => 123, } }; use Data::Dumper; print Dumper(analyse_user_inputs($data));