perl-5.38.0
$OS_ERROR
$ERRNO
$!

When referenced, $! retrieves the current value of the C errno integer variable. If $! is assigned a numerical value, that value is stored in errno. When referenced as a string, $! yields the system error string corresponding to errno.

参照されると、$! は C の errno 整数変数の現在の値を取得します。 $! に数値が代入されると、その値は errno に保管されます。 文字列として参照されると、$!errno に対応するシステムエラー 文字列を返します。

Many system or library calls set errno if they fail, to indicate the cause of failure. They usually do not set errno to zero if they succeed and may set errno to a non-zero value on success. This means errno, hence $!, is meaningful only immediately after a failure:

多くのシステムやライブラリ呼び出しは、失敗したときに、失敗の理由を示すために 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.
    if (open my $fh, "<", $filename) {
        # ここで $! は無意味。
        ...
    }
    else {
        # ここでだけ $! に意味がある。
        ...
        # ここで既に $! は無意味かもしれません。
    }
    # ここでは成功と失敗の両方の可能性があるので、
    # $! は無意味。

Here, meaningless means that $! may be unrelated to the outcome of the open() operator. Assignment to $! is similarly ephemeral. It can be used immediately before invoking the die() operator, to set the exit value, or to inspect the system error string corresponding to error n, or to restore $! to a meaningful state.

ここで、無意味 というのは $!open() 演算子の結果に 関係ないということです。 $! への代入も同様に一時的なものです。 これは、終了値を設定したり、エラー n に対応するシステムエラー文字列を 調べたり、$! を意味のある状態に復元するために、die() 演算子を 起動する直前で使えます。

Perl itself may set errno to a non-zero on failure even if no system call is performed.

Perl 自身は、システムコールを実行しなくても失敗時には errno に非ゼロを設定するかもしれません。

Mnemonic: What just went bang?

記憶法: 何が bang(!) したか。