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

I have a fairly newbie-esque question concerning return values. I am writing a script for an NT box to automate an FTP session. Another developer will be call this script with a non-Perl application. He said he needs my script to return a 1 on an error, and 0 if there's no error. Sounds simple but I've never done this before. Here's a skeleton of what I'm doing:
mysub1(); mysub2(); sub error { return 1; } mysub1 { if (problem){ then error(); } else { return 0; } } mysub2 { if (problem){ then error(); } else { return 0; } }
Is this the proper approach or am I missing a fundamental concept concept. Please help me, Monks, you're my only hope. ...Thanks...Kevin

Replies are listed 'Best First'.
Re: return values
by c-era (Curate) on Aug 09, 2001 at 17:31 UTC
    If he is calling your script he is probably looking for an exit value. Just use exit 1; if there is an error, and exit 0; if not.
Re: return values
by clemburg (Curate) on Aug 09, 2001 at 17:34 UTC

    You need to use the exit() function. Example:

    H:\>perl -e "exit(1) unless @ARGV" argument H:\>echo %ERRORLEVEL% 0 H:\>perl -e "exit(1) unless @ARGV" H:\>echo %ERRORLEVEL% 1 H:\>

    Christian Lemburg
    Brainbench MVP for Perl
    http://www.brainbench.com

Re: return values
by arturo (Vicar) on Aug 09, 2001 at 17:38 UTC

    then is not a keyword in perl, but you seem to have the basic idea. You probably want to look at the man page for exit, which you can pass an exit code to.

    Here's one way to do it. You could write the main algorithm as a subroutine, then have that subroutine return either 1 (failure) or 0 (success). See What is true and false in Perl? for information about how Perl understands "true". The basic program logic for this strategy looks like this:

    if (subroutine()) { # if the return value of subroutine is "true" (see + reference above) exit 0; # success } else { exit 1; # failure }

    Alternately, you could use a neat trick: have the *subroutine* return 0 for success and 1 for failure, and just call:

    exit subroutine();

    Which will execute the subroutine and exit with the value the subroutine returns.

    Last, but certainly not least, perl provides the die function, which returns an error status along with a (definable) error message. See die for more details on that, but it is the preferred way of raising exceptions in perl.

    HTH!

    perl -e 'print "How sweet does a rose smell? "; chomp ($n = <STDIN>); +$rose = "smells sweet to degree $n"; *other_name = *rose; print "$oth +er_name\n"'
Re: return values
by Hofmator (Curate) on Aug 09, 2001 at 17:35 UTC

    Have a look at exit. You are confusing return values from subroutines with the return value perl gives back to the operating system after it finished the execution. So exit; # or exit(0); exits your perl script and perl gives back 0 (=success). The same way for returning error: exit(1);

    -- Hofmator