On Mon, Mar 17, 2008 at 4:47 PM, Dermot <[EMAIL PROTECTED]> wrote: snip > print $fh $status."\n"; > print STDERR "$0: $! $?\n"; snip
$? holds the status returned by the last external call (call to system() function, pipes, qx// operator, call to wait() or waitpid(), or possibly the gethost*() functions), but you are not making an external call in your code, so it is inappropriate to be checking its value. $! is not gaurenteed to have a valid value unless an error code has been returned by the last function called, so unless print has an error $! could be anything (and often is something weird). from perldoc perlvar $? The status returned by the last pipe close, backtick ('') command, successful call to wait() or waitpid(), or from the system() operator. This is just the 16−bit status word returned by the wait() system call (or else is made up to look like it). Thus, the exit value of the subprocess is really ("$? >> 8"), and "$? & 127" gives which signal, if any, the process died from, and "$? & 128" reports whether there was a core dump. (Mnemonic: similar to sh and ksh.) Additionally, if the "h_errno" variable is supported in C, its value is returned via $? if any "gethost*()" function fails. If you have installed a signal handler for "SIGCHLD", the value of $? will usually be wrong outside that handler. Inside an "END" subroutine $? contains the value that is going to be given to "exit()". You can modify $? in an "END" subroutine to change the exit status of your program. For example: END { $? = 1 if $? == 255; # die would make it 255 } Under VMS, the pragma "use vmsish 'status'" makes $? reflect the actual VMS exit status, instead of the default emulation of POSIX status; see "$?" in perlvms for details. snip $! 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(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?) -- Chas. Owens wonkden.net The most important skill a programmer can have is the ability to read. -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/