Thanks John for your quick answer. what you said about: >Only the $? variable applies to the system() function. I think that >'del' is an internal command.com function (I haven't used DOS/Windows >in a long time) so $? will probably report the return status of > command.com? ...seems to be true: This is what is reported if the file 'pepe.txt' does not exist using 'system()': " BEFORE: ----- $@ is -><- $! is -><- $^E is -><- $? is ->0<- Could Not Find G:\Oscar\Computing\Perl\Proyectos\PCshutdownScript\pepe.txt (above a normal system error from 'del' command, I guess) AFTER: ---- $@ is -><- $! is ->No such file or directory<- $^E is ->The system cannot find the file specified<- $? is ->256<- (The value is not 0) " ... and this is what is reported when the file 'pepe.txt' does not exist using 'open': " BEFORE: ----- $@ is -><- $! is -><- $^E is -><- $? is ->0<- AFTER: ---- $@ is -><- $! is ->No such file or directory<- $^E is ->The system cannot find the file specified<- $? is ->0<- Could Not Find G:\Oscar\Computing\Perl\Proyectos\PCshutdownScript\pepe.txt " ...but - What happens if I use 'open'? I cannot see any difference if the file 'pepe.txt' exists or not :-? This is what is reported when the file 'pepe.txt' exists using 'open': " BEFORE: ----- $@ is -><- $! is -><- $^E is -><- $? is ->0<- AFTER: ---- $@ is -><- $! is ->No such file or directory<- $^E is ->The system cannot find the file specified<- $? is ->0<- " :-? Using 'open' I cannot say if the 'del' command was done correctly or not, although there is a message probably to STDERR that I do not know how to manage. :-( So far, I use 'open' a lot because if I open a file I can manage the information using the file handler. Answering your question to 'Do you want to handle errors or do you want to report errors?' I would like to handle the errors and I thought using these variable would be a good method, wouldn't be? Thanks again.
"John W. Krahn" <[EMAIL PROTECTED]> wrote: oscar gil wrote: > Hello everybody, Hello, > I wanted to learn a bit more about how to handle errors when I am > working with files, Do you want to handle errors or do you want to report errors? > so I wrote this simple script to start with it > where you can see that first I show the normal perl errors variables, > then I try to delete a file and finally I show the errors variables > again. > The file I try to delete exists and it is at the same directory and > after the script the file is deleted, so it works. > What surprised me is that at the end of the script the '$!' is 'No such > file or directory' and '$^E' is 'The system cannot find the file > specified' though the file was deleted correctly, :-?. > > My idea was to treat the '$!' when I am working with files but with > this results I don't see how. Have you read the documentation for the variables you are using? perldoc perlvar $CHILD_ERROR $? 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.) $OS_ERROR $ERRNO $! 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: $EXTENDED_OS_ERROR $^E Error information specific to the current operating system. At the moment, this differs from $! under only VMS, OS/2, and Win32 (and for MacPerl). On all other platforms, $^E is always just the same as $!. [ SNIP ] Under Win32, $^E always returns the last error information reported by the Win32 call "GetLastError()" which describes the last error from within the Win32 API. Most Win32-specific code will report errors via $^E. ANSI C and Unix-like calls set "errno" and so most portable Perl code will report errors via $!. Caveats mentioned in the description of $! generally apply to $^E, also. (Mnemonic: Extra error explanation.) $EVAL_ERROR $@ The Perl syntax error message from the last eval() operator. If $@ is the null string, the last eval() parsed and executed correctly (although the operations you invoked may have failed in the normal fashion). (Mnemonic: Where was the syntax error "at"?) > Let me tell you I am using this version of perl with Windows and I > tried it both, Win2k and WinXP: > This is perl, v5.8.7 built for MSWin32-x86-multi-thread > (with 14 registered patches, see perl -V for more detail) > > Here it is the script and afterwards there is the STDOUT exit. > > ---------------------------------------------------- > #!/usr/bin/perl -w > use strict; > > print "\n\n\nBEFORE:\n-----\n"; > print '$@'." is ->$@<-\n"; > print '$!'." is ->$!<-\n"; > print '$^E'." is ->$^E<-\n"; > print '$?'." is ->$?<-\n\n\n"; > > # I tried with open and with system() > #open (RD , "del pepe.txt |") or die "I cannot RD\n"; Only the $! or $^E variables apply after open() *FAILS*. If open() completed successfully then the values of $! and $^E are meaningless. > system ("del pepe.txt"); Only the $? variable applies to the system() function. I think that 'del' is an internal command.com function (I haven't used DOS/Windows in a long time) so $? will probably report the return status of command.com? [ SNIP ] > Questions: > > 1.- Why a have the '$!' and '$^E' set as it could not find the file > when in reality it could? Because the values of $! and $^E are only valid after an error occured. > I tried with 'system()' and with 'open' with the same results. :-( John -- Perl isn't a toolbox, but a small machine shop where you can special-order certain sorts of tools at low cost and in short order. -- Larry Wall -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/ --------------------------------- Looking for last minute shopping deals? Find them fast with Yahoo! Search.