Nope, because when you put variables inside double-quoted strings, they get interpolated. This is something you should already know, as you would use it in common statements such as print "The value is $value. The dog's name is $dog{name}. The third element is $elements[2]."
See this:
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;
Output:
Double quotes, existing key: <!exist bar>
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: <!exist bar>
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: <!exists $hash{bar}>
Not executing this time.
Single quotes, non-existing key: <!exists $hash{baz}>
This is executed!
Update: fixed a logical flaw spotted by AnomalousMonk. Thanks. |