$OS_ERROR
$ERRNO
$!

引用时,$! 检索 C errno 整数变量的当前值。如果 $! 被赋值为一个数字,则该值将存储在 errno 中。引用为字符串时,$! 会生成与 errno 相对应的系统错误字符串。

许多系统或库调用在失败时会设置 errno,以指示失败的原因。如果成功,它们通常不会errno 设置为零,并且可能会在成功时将 errno 设置为非零值。这意味着 errno(因此 $!)仅在失败立即才有意义

if (open my $fh, "<", $filename) {
    # Here $! is meaningless.
    ...
}
else {
    # ONLY here is $! meaningful.
    ...
    # Already here $! might be meaningless.
}
# Since here we might have either success or failure,
# $! is meaningless.

此处,无意义意味着 $! 可能与 open() 运算符的结果无关。对 $! 的赋值也同样短暂。它可以在调用 die() 运算符之前立即使用,以设置退出值,或检查与错误n 对应的系统错误字符串,或将 $! 恢复到有意义的状态。

即使未执行系统调用,Perl 本身也可能在失败时将 errno 设置为非零。

助记符:刚才发生了什么?