Perl $! vs $ @ builtin变量

时间:2014-01-20 16:37:51

标签: perl

关于Perl的内置错误指示 $! $ @ 的一个微不足道的问题。它们如何彼此不同,哪种更适合记录目的?

2 个答案:

答案 0 :(得分:5)

$!由系统调用错误设置。它对应于C的errno变量。

$@eval EXPReval BLOCK设置。它包含捕获的异常。

$?waitpidsystemclose设置(关闭使用open '-|'open '|-'打开的句柄时)。它包含有关已终止进程的信息。

大多数模块在出错时抛出异常,但有些模块设置了自己的错误变量(例如DBI,Text :: CSV_XS)。

记录的相应变量因您记录的内容而异。

例如,system通过$?$!报告错误。

system(...);
die("Unable to execute child: $!\n")              if $? < 0;
die("Child killed by signal ".( $? & 0x7F )."\n") if $? & 0x7F;
die("Child exited with error ".( $? >> 8 )."\n")  if $? >> 8;

答案 1 :(得分:2)

他们有完全不同的目的。您应该记录哪些取决于失败的原因。 (别忘了$?)

阅读http://perldoc.perl.org/perlvar.html#Error-Variables上的文档。