'b' => exists($tests{'b'}) && defined($m=$tests{'b'}) ? $m : 0, 'a' => exists($tests{'b'}) && defined($m=$tests{'a'}) ? $m : 0, ^^^^^ #### use strict; use warnings; use Data::Dump qw/pp dd/; my %tests = ( 'a' => 10, 'b' => 20, ); my $m; # this seems to assign $m once and never bother to check again my %hash; %hash = ( 'b' => exists($tests{'b'}) && defined($m=$tests{'b'}) ? $m : 0, 'a' => exists($tests{'b'}) && defined($m=$tests{'a'}) ? $m : 0, ); pp \%hash; %hash = ( 'b' => exists($tests{'b'}) && defined($m=$tests{'b'}) ? (0+$m) : 0, 'a' => exists($tests{'b'}) && defined($m=$tests{'a'}) ? (0+$m) : 0, ); pp \%hash; %hash = ( 'b' => exists($tests{'b'}) && defined($m=$tests{'b'}) ? "$m" : 0, 'a' => exists($tests{'b'}) && defined($m=$tests{'a'}) ? "$m" : 0, ); pp \%hash; #### { a => 10, b => 10 } { a => 10, b => 20 } { a => 10, b => 20 }