Perl
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;
};
if ( $@ ) {
print "Some error happen!! $@"
}
else {
print "All good!!"
}
unlink "temp.txt";
-----------------------------------------------------------------------------------
转自:http://weidagang2046.blog.51cto.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
相关知识
怎么在perl中安装PAR::Heavy module?急急急!!
计算机经典书籍电子书合集(适合计算机学生学习以及程序员笔试、面试)
(完整版)数据分析师笔试题目.docx
6 字符型数据及其处理
网站开发基础教程:从HTML到动态网页
频率与时间换算器
真爱誓言 20款完美婚戒甄选
七夕礼物大推荐 你知道的不知道的都在这
常见C/C++ XML解析器比较
生物信息学专业学什么
网址: Perl https://www.huajiangbk.com/newsview706381.html
上一篇: 大花蕙兰的管护 |
下一篇: Linux LVM 基本概念 |
推荐分享

- 1君子兰什么品种最名贵 十大名 4012
- 2世界上最名贵的10种兰花图片 3364
- 3花圈挽联怎么写? 3286
- 4迷信说家里不能放假花 家里摆 1878
- 5香山红叶什么时候红 1493
- 6花的意思,花的解释,花的拼音 1210
- 7教师节送什么花最合适 1167
- 8勿忘我花图片 1103
- 9橄榄枝的象征意义 1093
- 10洛阳的市花 1039