justkar4u has asked for the wisdom of the Perl Monks concerning the following question:

Hi all, I have recently started using perl have this module and am trying to use specific exit codes for specific purpose like say exit 0 for true, exit 1 for false and exit -1 for other internal code/file error.I also want to display some custom error messages as below. I read the documentation for exit but when I use it in the format exit -1 if(), then am not able to display the error message that i want to display also the exit code is same 0 for any conditions described below. I am aware that they have asked not to use exit codes in subroutines preferably. So I also read about using die.In die they have asked to use exit function if I want to use specific exit codes. So I am confused. Any suggestions/corrections where am going wrong ? Cant we have both error message and exit codes in perl?
package search; use strict; use warnings; sub find($$){ if ($#_ != 1) # Check the number of arguments for the command. + @ARGV is the default perl- { # Array that stores command line arguments return "Format Error:Usage- script.pl <filename> <'String'>\neg:search +.pl config_file 'X YZ'\n"; exit -1; } my $file=$_[0]; # Stores the filename my $key=$_[1]; # Stores the key my $count = 0; # To increment if keyword is found if (-e "$file") # Checks if file is present else Return Err +or { open (DATA,$file); chomp($key); # Removes the new line character from the +keyword while (defined (my $line = <DATA>)) # Search until Handle +is open { if ($line =~ /\b\Q$key\E\b/i) # Matches for the exact f +ull keyword(Does'nt show if the key is a part of another word) { return "Passed\n"; $count++; exit 0;} # Increment count if keyword found } if($count == 0) # If count is Zero, no Keyword +match was found { return "Failed\n" ; exit 1; } close (DATA); } else { return "Error: file does'nt exist\n"; exit -1; } } 1; # Must exit in true value
Am calling this module from other .pl script and passing the file name and keyword. - Thanks Ram

Replies are listed 'Best First'.
Re: Trouble using exit codes
by Eliya (Vicar) on Apr 06, 2011 at 18:16 UTC

    Do you want to exit (=terminate) the entire program, or do you just want to return from the subroutine with an "exit code" and error message?

    In the latter case, you could simply return two values from the subroutine(1).  Heavily simplified:

    #!/usr/bin/perl -w use strict; package search; sub find { # ... return (-1, "my error message"); } package main; my ($exitcode, $msg) = search::find("foo", "bar"); print "exit code: $exitcode, message: '$msg'\n";

    Generally, putting anything after an unconditional return in the same branch of execution doesn't make sense, because the code would never be run...

    sub find { ... if (...) { return "Passed\n"; $count++; # never executed ... }

    ___

    (1) or if you wanted to get fancy, you could use a dualvar

    package search; use Scalar::Util 'dualvar'; sub find { # ... return dualvar -1, "my error message"; } package main; my $ret = search::find("foo", "bar"); printf "exit code: %d, message: '%s'\n", $ret, $ret; # exit code: -1, message: 'my error message'
      Hi Eliya, Thanks a lot for the quick response !! It does work/display as I expected. It displays the error code that I am returning and the message. HOWEVER if I try this C:\perl>echo %ERRORLEVEL% command after execution of my script, I still get the value 0 for all the cases. Now am wondering if the above command is right or not for determinig the error code/exit code value.(I read somewehere that above command is equivalent of echo $? in linux).

        If you actually do want to exit the program, and pass some exit code to the calling process, there's nothing wrong with using exit.  In the above snippet, you could place the exit after the print, for example.

        ... print "exit code: $exitcode, message: '$msg'\n"; exit $exitcode;

        But note that negative exit codes are typically interpreted unsigned, e.g. in a Unix shell, -1 would turn into 255  (-2 into 254, etc.):

        $ perl -e "exit -1" $ echo $? 255