本文和大家重点讨论一下Perl Perl eval函数的概念,Perl eval函数可以看作是Perl虚拟机,它的参数就是一段Perl代码,并且利用’Perldoc–feval’可以获取Perl eval函数使用帮助。具体内容请看本文详细介绍。
Perl eval函数探讨
Perl作为一种脚本语言可以实时地生成和执行代码。这种特性可以把代码的编译推迟到运行时,所以又称为“动态代码”。另外,Perl也如 Java、C++一样提供了异常处理机制。本文将初步探讨Perl中实现动态代码和异常处理机制的函数:eval。如有错误不足,欢迎讨论和批评指正。
Perl eval函数可以看作是Perl虚拟机,它的参数就是一段Perl代码。利用’Perldoc–feval’可以获取Perl eval函数使用帮助,其中介绍了它的两种使用方式:
Perl eval函数之levalEXPR
EXPR是一个的表达式,例如:
eval"print$a";
eval'print$a'.',$b';
eval1+3;
eval'print'.'$a+$b,"\n"';
eval$command;#$command=‘print“helloPerl”’
eval$ARGV[0];
在执行时,Perl解释器会首先解析表达式的值,然后将表达式值作为一条Perl语句插入当前执行上下文。所以,新生成的语句与eval语句本身具有相同的上下文环境。这种方式中,每次执行eval语句,表达式都会被解析。所以,如果evalEXPR如果出现在循环中,表达式可能会被解析多次。eval的这种方式使得Perl脚本程序能实时生成和执行代码,从而实现了“动态代码”。
Perl eval函数之levalBLOCK
BLOCK是一个代码块,例如:
eval{print$a};
eval{$a=1,$b=2,$c=$a+$b};
与第一种方式不同,BLOCK只会被解析一次,然后整个插入当前Perl eval函数所在的执行上下文。由于解析上的性能的优势,以及可以在编译时进行代码语法检查,这种方式通常被作为Perl用来为一段代码提供异常捕捉机制,虽然前一种方式也可以。
按帮助的名称,称eval的参数程序为“小程序”(mini-program)。在两种方式中,Perl eval函数的返回值都是小程序的最后一条语句的值,如果遇到return语句,与子例程相同。
Script1:
-
#!/usr/bin/Perl-w
-
-
push(@program,'$i=1;');
-
push(@program,'$i=3;$j=2;$k=$i+$j');
-
push(@program,'$i=3;return24;$k=$i+$j');
-
-
foreach$exp(@program)
-
{
-
$rtn=eval($exp);
-
print$rtn,"\n";
-
}
-
Output:
-
1
-
5
-
24
如果小程序中有语法错误、运行时错误遇到die语句,eval将返回undef。错误码被保存在$@中。
Script2:
-
#!/usr/bin/Perl-w
-
-
push(@program,'$i=3;die"errormessage";$k=$i+$j');
-
-
foreach$exp(@program)
-
{
-
$rtn=eval($exp);
-
if(!defined($rtn))
-
{
-
print"Exception:",$@,"\n";
-
}
-
else
-
{
-
print$rtn,"\n";
-
}
-
};
Output:
Exception:errormessageat(eval1)line1.
Script3:
-
#!/usr/bin/Perl-w
-
-
#arun-timeerror
-
eval'$answer=';#sets$@
-
warn$@if$@;
-
-
Output:
-
syntaxerrorat(eval1)line2,atEOF
分享到:
相关推荐
Perl die、warn、eval函数使用总汇
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
离线安装包,亲测可用
Perl语言入门(第五版),本书是为中文版本,英文原版下载地址:...用eval捕获错误 用grep来筛选列表 用map对列表进行转换 不带引号的哈希键 切片 习题 附录a习题解答 附录b超越小骆驼...
实际上,为了更精确一点,此程序包从Perl中提取值到Go中。 这是由驱动的语言嵌入的一种不太常见的方法。 这是一个入门 // get a Perl interpreter p := plgo.New() p.Preamble = `use strict; use warnings;` // ...
其他:bless, defined, do, eval, formline, import, ref, scalar, syscall, tie, tied, undef, untie, wantarray 网络:endnetent, getnetbyaddr, getnetbyname, getnetent, setnetent 输出:die, print, printf,...
rpm -ivh perl-Eval-Closure-0.14-30.1.noarch.rpm rpm -ivh perl-MRO-Compat-0.13-32.1.noarch2.rpm rpm -ivh perl-Role-Tiny-2.000006-4.1.noarch.rpm rpm -ivh perl-Sub-Exporter-Progressive-0.001013-2.1....
这次我们来说如何禁止php代码中执行eval函数,本来以为直接修改php.ini中的disable_function即可~ 但现实往往并不是那么如意,查了一下GG,发现原来eval并非函数,而是php底层提供的一种特性。 幸好有前辈提供了php...
$EVAL_ERROR G $EXECUTABLE_NAME G $FORMAT_FORMFEED G $FORMAT_LINES_LEFT G $FORMAT_LINES_PER_PAGE G $FORMAT_LINE_BREAK_CHARACTERS G $FORMAT_NAME G $FORMAT_PAGE_NUMBER G $FORMAT_TOP_NAME G $IN...
./lib ./plugins) at (eval 4) line 1. 这是缺少 Perl 的 URI:Escape模块 下载附件URI-1.58.tar.gz即URI:Escape模块,安装, 解压缩文件 tar zxvf URI-1.58.tar.gz 进入解压缩后目录 cd URI-1.58 然后 ...
perl msir14-eval.pl <qrel> <run> <verbose> 样品用量 perl msir14-eval.pl sample_qrel.txt sample_run.txt 0 样本输出 Query NDCG@1 NDCG@5 NDCG@10 MAP MRR RECALL average 1.0000 0.7871
perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.8/i386-linux-thread-multi /usr/lib/perl5/5.8.8 .) at (eval 7) line 3. Perhaps the DBD:...
java开发抽奖系统源码面向 Perl 5 ...名称和引用,以便您稍后可以搜索特定关键字,例如“perldoc”、“eval”、“Test::More”等。 最后,请记住,我仍在学习 Scala,它是一种非常大的语言,因此我
名称WWW :: Mechanize :: PhantomJS-自动运行PhantomJS浏览器...$mech->eval_in_page('alert("Hello PhantomJS")');my $png= $mech->content_as_png();WWW::Mechanize::PhantomJS->new %options my $mech = WWW
预测写在eval目录中的proposal_answers.txt中。 官方评估 $ python3 official_eval.py # macro-averaged F1 = 88.29% 根据官方评估perl脚本进行评估。 MACRO平均f1得分(Other关系除外) 可以在eval目录中的result....
第一章:数据引用与匿名存储 第二章:实现复杂的数据结构 第三章:Typeglob 和 符号表 第四章:子例程引用与闭包 第五章:Eval 第六章:模块 第七章:面向对象编程 第八章:绑定 第九章:持续性 ......
REPL 会话示例 $ perl6 -Ilib repl>>> (car '(x))x>>> (eq 'foo (car '(foo)))t>>> ((lambda (x) (cons x '(b))) 'a)(a b)>>> (eval '((lambda (x) (cons x '(b))) 'a) '())(a b)>>> ^D$计划 <masak> possible ...
Test::Apocalypse - Apocalypse 最喜欢的测试捆绑到一个简单的界面中 版本 This document describes v1.006 of Test::Apocalypse - released October 25, 2014 as part of Test-Apocalypse. 概要 #!/usr/bin/perl ...
#perl Makefile.PL 如果出现: Warning: prerequisite Date::Calc 0 not found at (eval 1) line 219. Warning: prerequisite Date::Parse 0 not found at (eval 1) line 219. Warning: prerequisite File::Tail 0 ...