Perl中$@和$!的区别

16
在Perl中,$@$!有什么区别?与eval相关的错误是用$@输出的,而$!也用于捕获错误。那么它们之间有什么区别呢?
3个回答

22

来自perldoc perlvar:

变量$@$!$^E$?包含有关Perl程序执行期间可能出现的不同类型的错误条件的信息。这些变量按照报告错误的子系统与Perl进程之间的“距离”排序。依次对应于由Perl解释器、C库、操作系统或外部程序检测到的错误。


11

$!在系统调用失败时被设置。

open my $fh, '<', '/foobarbaz' or die $!

这将会输出 "No such file or directory"。

$@ 包含传递给 die 的参数。因此:

eval {
    open my $fh, '<', '/foobarbaz' or die $!
};
if ( $@ ) {
   warn "Caught exception: $@";
}

如果没有使用某种形式的eval来检查$@,那么检查它就没有意义;如果你还没有调用可以在出现错误时设置$!的函数,那么检查$!也是没有意义的。


1
基于 perl_doc
$!; show C library\'s errno
$@; show compile error

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接