Watch Your Quotes
There are some subtleties associated with the way quotes or blocks are interpreted by Perl. Consider the differences between the following statements:
$str = '$c = 10'; # eval $str; # 1 eval "$str"; # 2 eval '$str'; # 3 eval { $str }; # 4
Cases 1 and 2 have identical results, and cases 3 and 4 behave
identically. Can you see why? The trick is to know what the
interpreter does before handing it over to
eval
.
In case 1, Perl gives the contents of
$str
to eval
, just as it would
for any other function. Hence eval
sees the string
'$c
=
10'
,
treats it like a little program, and executes it.
In case 2, Perl does variable interpolation on the double-quoted
string before handing it over to eval
. Again,
eval
sees the contents of $str
,
compiles it, and executes it, assigning 10 to $c
.
In case 3, the argument to eval
is a single-quoted
string, which is not expanded during the variable interpolation
stage. For this reason, eval
sees a hardcoded
string (with the characters “$”, “s”,
“t”, “r”) and treats it like a little program
as before. As a standalone program, it is quite useless, of course.
Since eval
returns the result of the last
expression, it returns the value of $str
(the
string $c
=
10
). That is, if you say,
$s = eval '$str';
$s
will contain $c
=
10
.
Case 4 is identical to case 3, except that the code inside the block is checked for syntax errors at compile-time (at the same time as the rest of the script).
That’s all there is to know about eval
. Now, let us see how to ...
Get Advanced Perl Programming now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.