evalEXPR
evalBLOCK
The value expressed by
EXPR
is parsed and executed as though it were a little Perl program. It is executed in the context of the current Perl program, so that any variable settings remain afterward, as do any subroutine or format definitions. The code of the
eval
is treated as a block, so any locally scoped variables declared within the
eval
last only until the
eval
is done. (See
local
and
my
.) As with any code in a block, a final semicolon is not required. If
EXPR
is omitted, the operator evaluates
$_
.
The value returned from an eval is the value of the last expression evaluated, just as with subroutines. Similarly, you may use the return operator to return a value from the middle of the eval . If there is a syntax error or run-time error (including any produced by the die operator), eval returns the undefined value and puts the error message in $@ . If there is no error, $@ is guaranteed to be set to the null string, so you can test it reliably afterward for errors.
Here's a statement that assigns an element to a hash chosen at run-time:
eval "\$$arrayname{\$key} = 1";
(You can accomplish that more simply with soft references - see "Symbolic References" in Chapter 4, References and Nested Data Structures .) And here is a simple Perl shell:
while (<>) { eval; print $@; }
Since
eval
traps otherwise-fatal errors, it is useful for determining whether a particular feature (such as
socket
or
symlink
) is implemented. In fact,
eval
is the way to do all exception handling in Perl. If the code to be executed doesn't vary, you should use the
eval
BLOCK
form to trap run-time errors; the code in the block is compiled only once rather than on each execution, yielding greater efficiency. The error, if any, is still returned in
$@
. Examples:
# make divide-by-zero non-fatal eval { $answer = $a / $b; }; warn $@ if $@; # same thing, but less efficient eval '$answer = $a / $b'; warn $@ if $@; # a compile-time error (not trapped) eval { $answer = }; # a run-time error eval '$answer ='; # sets $@
Here, the code in the
BLOCK
has to be valid Perl code to make it past the compilation phase. The code in the string doesn't get examined until run-time, and so doesn't cause an error until run-time.
With an eval you should be careful to remember what's being looked at when:
eval $x; # CASE 1 eval "$x"; # CASE 2 eval '$x'; # CASE 3 eval { $x }; # CASE 4 eval "\$$x++"; # CASE 5 $$x++; # CASE 6
Cases 1 and 2 above behave identically: they run the code contained in the variable
$x
. (Case 2 has misleading double quotes, making the reader wonder what else might be happening, when nothing is. The contents of
$x
would in any event have to be converted to a string for parsing.) Cases 3 and 4 likewise behave in the same way: they run the code
$x
, which does nothing at all except return the value of
$x
. (Case 4 is preferred since the expression doesn't need to recompiled each time.) Case 5 is a place where normally you
would
like to use double quotes to let you interpolate the variable name, except that in this particular situation you can just use symbolic references instead, as in case 6.
A frequently asked question is how to set up an exit routine. One common way is to use an
END
block. But you can also do it with an
eval
, like this:
#!/usr/bin/perl eval <<'EndOfEval'; $start = __LINE__; . . # your ad here . EndOfEval # Cleanup unlink "/tmp/myfile$$"; $@ && ($@ =~ s/\(eval \d+\) at line (\d+)/$0 . " line " . ($1+$start)/e, die $@); exit 0;
Note that the code supplied for an
eval
might not be recompiled if the text hasn't changed. On the rare occasions when you want to force a recompilation (because you want to reset a
..
operator, for instance), you could say something like this:
eval $prog . '#' . ++$seq;