14

Perl$@和 和有什么区别?$!与相关的错误使用eval输出$@$!也用于捕获错误。那么两者有什么区别呢?

4

3 回答 3

20

perldoc perlvar

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

于 2013-07-17T10:02:46.287 回答
9

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

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

这将输出“没有这样的文件或目录”。

$@包含传递给 的参数die。所以:

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

$@不使用某种形式的检查eval是没有意义的,并且$!当你没有调用一个可以在错误情况下设置它的函数时检查是没有意义的。

于 2013-07-17T10:09:54.630 回答
1

基于perl_doc

$!; show C library\'s errno
$@; show compile error
于 2020-03-15T12:35:39.393 回答