引用时,$! 检索 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 设置为非零。
助记符:刚才发生了什么?