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