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
相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息