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;