use strict; use warnings; my %hash = ( foo => "bar", bar => "baz" ); sub testAndExec { my $cond = shift; if (eval $cond) { print "This is executed!\n"; } else { print "Not executing this time.\n"; } print "But there was an error:\n $@" if $@; print "\n"; } my $exeif = "!exist $hash{foo}"; print "Double quotes, existing key: <$exeif>\n"; testAndExec $exeif; $exeif = "!exist $hash{foo}"; print "Double quotes, existing key: <$exeif>\n"; testAndExec $exeif; $exeif = '!exists $hash{bar}'; print "Single quotes, existing key: <$exeif>\n"; testAndExec $exeif; $exeif = '!exists $hash{baz}'; print "Single quotes, non-existing key: <$exeif>\n"; testAndExec $exeif; #### Double quotes, existing key: Not executing this time. But there was an error: Can't locate object method "exist" via package "bar" (perhaps you forgot to load "bar"?) at (eval 1) line 1. Double quotes, existing key: Not executing this time. But there was an error: Can't locate object method "exist" via package "bar" (perhaps you forgot to load "bar"?) at (eval 2) line 1. Single quotes, existing key: Not executing this time. Single quotes, non-existing key: This is executed!