perl 的 eval 有两个做用:小程序
合成指令并加以执行app
用来除错 ( 像 try .. catch 的形式 )函数
合成指令并加以执行post
1
2
3
4
5
6
7
|
$x
=
"good to go!"
;
sub
true {
print
"It's True! @_"
}
sub
false {
print
"It's False! Nothing is given"
}
$run_sub
=
$x
?
"true"
:
"false"
;
eval
"$run_sub ($x)"
|
用来除错性能
有时, 咱们的程序会用上其余模块, 而其余模块在运行过程当中可能由于种种缘由而半途很负责任地 die() 了. 但以咱们一整个程序的流程而言, 一般咱们不但愿这样, 例如在调用该模块的涵数以前, 可能咱们已写了个暂存文档, 而若是调用该模块的涵数时 die 了, 那麼以前的那暂存档就会成为垃圾了, 因此, 咱们能够行用 eval 取会 die 的主导权, 这里作个更简单的例子spa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
open
F,
">temp.txt"
;
print
F
"hello world"
;
close
F;
eval
{
1/0;
# 这会作成 division by zero 的 die() 错误
};
# 留意这里是要分号的!
if
( $@ ) {
# 这就是在 eval 发现抓到错了!
print
"Some error happen!! $@"
# 这样就能够获得错误的讯息
}
else
{
print
"All good!!"
}
unlink
"temp.txt"
;
# 这个 temp.txt 就能够保证不会成为垃圾了
|
-----------------------------------------------------------------------------------code
转自:http://weidagang2046.blog.51cto.com/246444/45923/blog
1 l eval EXPR 2 EXPR 是一个的表达式,例如: 3 eval "print $a" ; 4 eval 'print $a' . ', $b' ; 5 eval 1 + 3 ; 6 eval 'print ' . '$a + $b, "\n"' ; 7 eval $command;#$command = ‘print “hello Perl”’ 8 eval $ARGV[0];
1 l eval BLOCK 2 BLOCK 是一个代码块,例如: 3 eval {print $a}; 4 eval {$a = 1, $b = 2, $c = $a + $b};
1 Script1: 2 #!/usr/bin/perl -w 3 4 push ( @program,'$i = 1;'); 5 push ( @program,'$i = 3; $j = 2; $k = $i + $j'); 6 push ( @program, '$i = 3; return 24; $k = $i + $j'); 7 8 foreach $exp (@program) 9 { 10 $rtn =eval($exp); 11 print $rtn,"\n"; 12 } 13 Output: 14 1 15 5 16 24
1 Script2: 2 #!/usr/bin/perl -w 3 4 push ( @program, '$i = 3; die "error message"; $k = $i + $j'); 5 6 foreach $exp (@program) 7 { 8 $rtn =eval($exp); 9 if ( ! defined ( $rtn)) 10 { 11 print "Exception: " , $@,"\n"; 12 } 13 else 14 { 15 print $rtn,"\n"; 16 } 17 } ; 18 19 Output: 20 Exception: error message at (eval 1) line 1.
1 Script3: 2 #!/usr/bin/perl -w 3 4 # a run-time error 5 eval '$answer =' ; # sets $@ 6 warn $@ if$@; 7 8 Output: 9 syntax error at (eval 1) line 2, at EOF