It's a little deeper than that.
use Devel::Peek;
$! = 0.0;
Dump($!);
stat("non_existing_file");
Dump($!);
die "died at first stat" if -$!;
stat("non_existing_file");
Dump($!);
die "died at second stat" if -$!;
now yields
SV = PVMG(0x82c690) at 0x803478
REFCNT = 1
FLAGS = (GMG,SMG,pIOK,pNOK)
IV = 0
NV = 0
PV = 0
MAGIC = 0x804900
MG_VIRTUAL = &PL_vtbl_sv
MG_TYPE = PERL_MAGIC_sv(\0)
MG_OBJ = 0x803460
MG_LEN = 1
MG_PTR = 0x8032d0 "!"
SV = PVMG(0x82c690) at 0x803478
REFCNT = 1
FLAGS = (GMG,SMG,pIOK,pNOK)
IV = 0
NV = 0
PV = 0
MAGIC = 0x804900
MG_VIRTUAL = &PL_vtbl_sv
MG_TYPE = PERL_MAGIC_sv(\0)
MG_OBJ = 0x803460
MG_LEN = 1
MG_PTR = 0x8032d0 "!"
died at first stat at bug.pl line 6.
pNOK is now set, but the value hasn't been updated by stat itself. It's only when $! is referenced that the updated value materializes.
I certainly wouldn't recommend using -$!, but
perlvar
says
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:
so one can be excused for doing numerical things. It also says
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.
and having to assign a non-integer value to avoid surprises doesn't fall in
my category of "do what I mean".
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.