设为首页 收藏本站
查看: 882|回复: 0

[经验分享] Perl-eval

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-12-27 12:06:28 | 显示全部楼层 |阅读模式
  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[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
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156924-1-1.html 上篇帖子: perl处理含有中文字符的json编码 下篇帖子: Perl 关键词搜索机器人
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表