Perl as a scripting language can generate and execute code in real time. This feature can delay the compilation of the code until runtime, so it is also called "dynamic code". In addition, Perl also provides an exception handling mechanism like Java and C++. This article will briefly explore the functions in Perl that implement dynamic code and exception handling mechanism: eval. If there are any mistakes and shortcomings, please discuss and criticize and correct them.
The eval function can be regarded as a Perl virtual machine, and its parameters are a piece of Perl code. Use 'perldoc -f eval' to get the help of using the eval function, which introduces two ways to use it:
eval EXPR
EXPR is an expression, for example:
eval "print $a" ;
eval 'print $a' . ', $b' ;
eval 1 + 3 ;
eval 'print ' . '$a + $b, "\n"' ;
eval $command;#$command = ‘print “hello Perl”'
eval $ARGV[0];
On execution, the Perl interpreter first parses the value of the expression and inserts the expression value into the current execution context as a Perl statement. Therefore, the newly generated statement has the same context as the eval statement itself. In this way, each time an eval statement is executed, the expression will be parsed. So, if eval EXPR appears in a loop, the expression may be parsed multiple times. This method of eval enables Perl scripting programs to generate and execute code in real time, thus implementing "dynamic code".
eval BLOCK
BLOCK is a code block, for example:
eval {print $a};
eval {$a = 1, $b = 2, $c = $a + $b};
Unlike the first method, BLOCK is parsed only once, and then the entire execution context in which the current eval function is located is inserted. Due to the advantages of parsing performance and the ability to perform code syntax checks at compile time, this method is usually used as Perl to provide an exception capture mechanism for a piece of code, although the former method can also be used.
According to the name of the help, the parameter program of eval is called "mini-program". In both ways, the return value of the eval function is the value of the last statement of the applet. If the return statement is encountered, it is the same as the subroutine.
Script1:
#!/usr/bin/perl -w
push ( @program,'$i = 1;');
push ( @program,'$i = 3; $j = 2; $k = $i + $j');
push ( @program, '$i = 3; return 24; $k = $i + $j');
foreach $exp (@program)
{
$rtn =eval($exp);
print $rtn,"\n";
}
Output:
1
5
24
If there is a syntax error in the applet or a runtime error encounters a die statement, eval will return undef. The error code is saved in $@.
Script2:
#!/usr/bin/perl -w
push ( @program, '$i = 3; die "error message"; $k = $i + $j');
foreach $exp (@program)
{
$rtn =eval($exp);
if ( ! defined ( $rtn))
{
print "Exception: " , $@,"\n";
}
else
{
print $rtn,"\n";
}
} ;
Output:
Exception: error message at (eval 1) line 1.
Script3:
#!/usr/bin/perl -w
# a run-time error
eval '$answer =' ; # sets $@
warn $@ if$@;
Output:
syntax error at (eval 1) line 2, at EOF