If used numerically, yields the current value of the C errno
variable, or in other words, if a system or library call fails, it sets this variable. This means that the value of $!
is meaningful only immediately after a failure:
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,
# here $! is meaningless.
In the above meaningless stands for anything: zero, non-zero, undef
. A successful system or library call does not set the variable to zero.
If used as a string, yields the corresponding system error string. You can assign a number to $!
to set errno if, for instance, you want "$!"
to return the string for error n, or you want to set the exit value for the die() operator. (Mnemonic: What just went bang?)
Also see "Error Indicators".