|
eval 函数用来计算表达式的值,它常用于捕捉错误和处理异常。位于 eval 之后的语句块是作为单独的 Perl 程序来处理和解析的,其中的所有变量设置,子例程以及格式定义都将保持到 eval 执行完毕。
eval 的返回值是上一个表达式的值,如果出现编译错误,运行时错误,或者执行了 die 语句,那么返回未定义值,并将错误消息记录到 $@ 特殊变量中。如果一切正常,那么 $@ 的内容是空的字符串。
测试代码1,使用 eval 对表达式求值:
[code=perl]#!/usr/bin/perl
print "> ";
while (<STDIN>) {
$result = eval; # eval 后不接任何东西则默认的处理对象是 $_
warn $@ if $@; # 如果 $@ 不为空则表示 $_ 中有出错信息
print "$result\n" if $result; #一切正常,打印结果
print "> "; #继续下一轮输入测试
}[/mw_shl_code]
运行输出:$ ./eval.pl
> hello
hello
> 5/2
2.5
> 3*6+10
28
> 10/0 #除法出错
Illegal division by zero at (eval 4) line 1, <STDIN> line 4.
> "OK #输入字符串出错
Can't find string terminator '"' anywhere before EOF at (eval 5) line 1, <STDIN> line 5.
> exit
测试代码2,使用 eval 捕捉程序中的错误:
[code=perl]#!/usr/bin/perl
print "Input a number: ";
chop ($a = <STDIN>);
print "Input a divisor: ";
chop ($b = <STDIN>);
eval { $answer = $a/$b; };
warn $@ if $@; #可以捕捉到除法的错误执行
printf "Division of %.2f by %.2f is %.2f.\n", $a, $b, $answer if $answer;
print "I am here now\n";
[/mw_shl_code]
运行输出:
$ ./eval2.pl
Input a number: 100
Input a divisor: 2
Division of 100.00 by 2.00 is 50.00.
I am here now
$ ./eval2.plInput a number: 100
Input a divisor: 0Illegal division by zero at ./eval2.pl line 12, <STDIN> line 2.
I am here now |
|