在Perl中,
$@
和$!
有什么区别?与eval
相关的错误是用$@
输出的,而$!
也用于捕获错误。那么它们之间有什么区别呢?变量
$@
、$!
、$^E
和$?
包含有关Perl程序执行期间可能出现的不同类型的错误条件的信息。这些变量按照报告错误的子系统与Perl进程之间的“距离”排序。依次对应于由Perl解释器、C库、操作系统或外部程序检测到的错误。
$!
在系统调用失败时被设置。
open my $fh, '<', '/foobarbaz' or die $!
这将会输出 "No such file or directory"。
$@
包含传递给 die
的参数。因此:
eval {
open my $fh, '<', '/foobarbaz' or die $!
};
if ( $@ ) {
warn "Caught exception: $@";
}
如果没有使用某种形式的eval
来检查$@
,那么检查它就没有意义;如果你还没有调用可以在出现错误时设置$!
的函数,那么检查$!
也是没有意义的。