Perl-eval

perl 的 eval 有兩個做用:小程序

  1. 合成指令並加以執行app

  2. 用來除錯 ( 像 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  "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

 

Perl 做爲一種腳本語言能夠實時地生成和執行代碼。這種特性能夠把代碼的編譯推遲到運行時,因此又稱爲「動態代碼」。另外, Perl 也如 Java 、 C++ 同樣提供了異常處理機制。本文將初步探討Perl 中實現動態代碼和異常處理機制的函數: eval 。若有錯誤不足,歡迎討論和批評指正。
 
eval 函數能夠看做是 Perl 虛擬機,它的參數就是一段 Perl 代碼。利用 ’perldoc –f eval’能夠獲取 eval 函數使用幫助,其中介紹了它的兩種使用方式:
 1.
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];

 

在執行時, Perl 解釋器會首先解析表達式的值,而後將表達式值做爲一條 Perl 語句插入當前執行上下文。因此,新生成的語句與 eval 語句自己具備相同的上下文環境。這種方式中,每次執行eval 語句,表達式都會被解析。因此,若是 eval EXPR 若是出如今循環中,表達式可能會被解析屢次。 eval 的這種方式使得 Perl 腳本程序能實時生成和執行代碼,從而實現了「動態代碼」。
 2.
1 l         eval BLOCK 2 BLOCK 是一個代碼塊,例如:
3 eval {print $a};
4 eval {$a = 1, $b = 2, $c = $a + $b};

 

與第一種方式不一樣, BLOCK 只會被解析一次,而後整個插入當前 eval 函數所在的執行上下文。因爲解析上的性能的優點,以及能夠在編譯時進行代碼語法檢查,這種方式一般被做爲 Perl 用來爲一段代碼提供異常捕捉機制,雖然前一種方式也能夠。
 
按幫助的名稱,稱 eval 的參數程序爲「小程序」 (mini-program) 。在兩種方式中, eval 函數的返回值都是小程序的最後一條語句的值,若是遇到 return 語句,與子例程相同。
 
 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

 

 
若是小程序中有語法錯誤、運行時錯誤遇到 die 語句, eval 將返回 undef 。錯誤碼被保存在$@ 中。
 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
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息