Perl eval使用方法
eval捕获错误
Perl代码在发生编译错误时会将错误信息保存在$!
变量。
而我们常用的处理方式是使用die
强制终结程序,这样往往会导致程序过早终止。
open FILEHANDLE,"<",$filename or die $!; ## die强制退出
Perl使用eval
操作符作为错误捕获机制。
- 作为捕获错误使用时,
eval
的参数是用一对‘{’ ‘}’包围的代码块
eval {$average = $total / $count};
当发生错误时,代码块将停止执行,
eval
语句块之后的程序仍然继续执行通常在
eval
语句块之后,紧跟着立即检查$@
变量,这个变量要么为空(eval
没有错误),要么包含代码执行失败的错误消息。
eval {$average = $total / $count};
print "some error: $@" if $@;
eval
语句块有类似于子例程的返回值
- 返回最后一行表达式的求值
- 使用return关键字显式的返回
- 如果发生错误,返回
undef
$average = eval { $total / $count}; ## 同 eval {$average = $total / $count};
my @array = eval {my @arr = qw/a b c d/; return @arr;}; ## @array = ("a", "b", "c", "d");
eval运行时编译代码
在运行时通过字符串的方式编译和执行代码
eval
语句块的第二种形式,它的参数是字符串表达式而不是代码块。
my $sum = 0;
eval '$sum = 2 + 2;';
print "The sum is $sum\n";
## The sum is 4
### 用eval动态生成一个复杂的hash
use warnings;
use strict;
use Data::Dumper; ## 提供Dumper函数打印复杂的数据结构
my %hash; ## 声明hash
my $value = "this is value"; ## 这个是一会儿要放入hash的值
my $string = '$hash'; ## 给eval编译的字符串
my $level = 10; ## 从外界获取的数据
## 组装hash
for(0 .. $level) {
$string .= "{$_}";
}
$string .= '= $value;'; ## $hash{0}{1}{2}...{$level} = $value
eval $string;
print $@ if $@;
print Dumper(\%hash);