Home
Search Perl pages
Subjects
By activity
Professions, Sciences, Humanities, Business, ...
User Interface
Text-based, GUI, Audio, Video, Keyboards, Mouse, Images,...
Text Strings
Conversions, tests, processing, manipulation,...
Math
Integer, Floating point, Matrix, Statistics, Boolean, ...
Processing
Algorithms, Memory, Process control, Debugging, ...
Stored Data
Data storage, Integrity, Encryption, Compression, ...
Communications
Networks, protocols, Interprocess, Remote, Client Server, ...
Hard World Timing, Calendar and Clock, Audio, Video, Printer, Controls...
File System
Management, Filtering, File & Directory access, Viewers, ...
|
|
|
eval EXPR
eval BLOCK
EXPR is parsed and executed as if it were a little
Perl program. It is executed in the context of the current Perl program, so
that any variable settings or subroutine and format definitions remain
afterwards. The value returned is the value of the last expression
evaluated, or a return statement may be used, just as with subroutines. The
last expression is evaluated in scalar or array context, depending on the
context of the eval.
If there is a syntax error or runtime error, or a die()
statement is executed, an undefined value is returned by
eval(), and $@ is set to the error message. If there was no error, $@ is guaranteed to be a null string. If
EXPR is omitted, evaluates $_ . The final semicolon, if any, may be omitted from the expression. Beware that using eval() neither silences perl from printing warnings to
STDERR, nor does it stuff the text of warning messages into
$@ . To do either of those, you have to use the $SIG{__WARN__} facility. See warn() and the perlvar manpage.
Note that, because eval() traps otherwise-fatal errors, it is
useful for determining whether a particular feature (such as
socket() or symlink()) is implemented. It is also
Perl's exception trapping mechanism, where the die operator is used to
raise exceptions.
If the code to be executed doesn't vary, you may use the eval-BLOCK form to
trap run-time errors without incurring the penalty of recompiling each
time. The error, if any, is still returned in $@ . Examples:
# make divide-by-zero nonfatal
eval { $answer = $a / $b; }; warn $@ if $@;
# same thing, but less efficient
eval '$answer = $a / $b'; warn $@ if $@;
# a compile-time error
eval { $answer = };
# a run-time error
eval '$answer ='; # sets $@
When using the eval{} form as an exception trap in libraries, you may wish
not to trigger any __DIE__ hooks that user code may have installed. You can use the local $SIG{__DIE__} construct for this purpose, as shown in this example:
# a very private exception trap for divide-by-zero
eval { local $SIG{'__DIE__'}; $answer = $a / $b; }; warn $@ if $@;
This is especially significant, given that __DIE__ hooks can call die() again, which has the effect of changing
their error messages:
# __DIE__ hooks may modify error messages
{
local $SIG{'__DIE__'} = sub { (my $x = $_[0]) =~ s/foo/bar/g; die $x };
eval { die "foo foofs here" };
print $@ if $@; # prints "bar barfs here"
}
With an eval(), you should be especially 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. (Although case 2 has misleading double quotes making the
reader wonder what else might be happening (nothing is).) Cases 3 and 4
likewise behave in the same way: they run the code '$x', which does nothing
but return the value of $x. (Case 4 is preferred for purely visual reasons, but it also has the
advantage of compiling at compile-time instead of at run-time.) Case 5 is a
place where normally you WOULD like to use double quotes, except that in this particular situation, you
can just use symbolic references instead, as in case 6.
Source: Perl builtin functions Copyright: Larry Wall, et al. |
Next: exec LIST
Previous: eof FILEHANDLE
(Corrections, notes, and links courtesy of RocketAware.com)
Up to: PERL
Rapid-Links:
Search | About | Comments | Submit Path: RocketAware > Perl >
perlfunc/eval.htm
RocketAware.com is a service of Mib Software Copyright 2000, Forrest J. Cavalier III. All Rights Reserved. We welcome submissions and comments
|