rfcd12 发表于 2015-12-27 12:06:28

Perl-eval

  perl 的 eval 有两个作用:


[*]  合成指令并加以执行

[*]  用来除错 ( 像 try .. catch 的形式 )

  
  合成指令并加以执行






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 的主导权, 这里做个更简单的例子






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 就可以保证不会成为垃圾了



  
  
  
  -----------------------------------------------------------------------------------




  转自:http://weidagang2046.blog.iyunv.com/246444/45923/
  


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;
  


在执行时, 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
  
  
页: [1]
查看完整版本: Perl-eval