$ cat t.pl use strict; use warnings; use Data::Dumper; my %tests = ( 'a' => 10, 'b' => 20, 'd' => 40, ); my ($m, $n); # this seems to assign $m once and never bother to check again my %hash = ( 'd' => exists($tests{'d'}) && defined($n=$tests{'d'}) ? $n : 0, 'b' => exists($tests{'b'}) && defined($m=$tests{'b'}) ? $m : 0, 'c' => exists($tests{'c'}) && defined($m=$tests{'c'}) ? $m : 0, 'a' => exists($tests{'a'}) && defined($m=$tests{'a'}) ? $m : 0, ); print Dumper(\%hash); $ perl t.pl $VAR1 = { 'c' => 0, 'b' => 10, 'd' => 40, 'a' => 10 };