Perl中汇报错误的特殊变量
变量 |
英文名 |
描述 |
$! |
$ERROR and $OS_ERROR
|
操作系统或者库函数调用的错误 |
$? |
$CHILD_ERROR |
最近一次调用wait()得到的返回值 |
$@ |
$EVAL_ERROR |
最近一次调用eval()得到的错误 |
$^E |
$EXTENDED_OS_ERROR |
操作系统特有的错误信息 |
$!
Perl解析器是一个C程序,他的很多工作都是通过C语言的函数库来完成的.$!保存的就是调用底层C函数的返回值.返回值的等义在头文件 errno.h 中,文件中把符号常量和错误值关联起来.
库函数调用失败会设置$!,调用成功不会修改$!,也不会重置,而是保持上一次的值.所以不能用$!来判断调用是否成功.
$?
在上一次管道关闭,反引号命令,wait,waitpid,system函数调用返回的状态.实质是底层的wait(2)和waitpid(2)系统调用所返回的16位状态.
这个退出状态不同于返回值.它由2个字节组成.高字节为子程序的返回值,低7位存使程序终止的信号代码,如果造成了内核转转储,低字节的第8位将被设为1.
当程序使用exit函数时,exit的参数将被作为进程的返回值.如果是其他程序调用,该返回值变为$?的高字节.
if ($? == -1) { print "failed to execute: $!\n"; } elsif ($? & 127) { printf "child died with signal %d, %s coredump\n",($? & 127), ($? & 128) ? 'with' : 'without'; } else { printf "child exited with value %d\n", $? >> 8; } |
注: $? 为 -1 表示执行子进程失败.如 system 执行一个不存在的命令,$?就将返回 -1.
$@
保存上一次eval捕获的错误信息.
在每次执行eval语句时,就会重置$@为undef.所以在eval调用后即可通过$@的值判断是否产生错误.
注意和$!的区别:$!在失败时才会修改,而$@在每次执行eval前就会重置为undef.$^E
通常情况下,标准的Perl中,$^E和$!是一样的.在windows,OS/2,VMS或Macperl上可能会得到额外的信息.
阅读(3384) | 评论(0) | 转发(0) |