[Israel.pm] defined @array

Gaal Yahas gaal at forum2.org
Wed Nov 17 04:17:10 PST 2004


On Wed, Nov 17, 2004 at 12:07:03PM +0200, Yossi.Itzkovich at ecitele.com wrote:
> I have a function that returns a list. The list could be empty.  When I
> have an error I want to return undef.
> 
> In the calling code I want to know if the list is empty or I got undef, so
> first I check:
> if (defined @array)....
> 
> But -w gives me :
> "defined(@array) is deprecated at... May be you should just omit the
> defined ?"
> 
> But then I will not be able to differ between empty list and undef, isn't
> it ?

The short answer is that you should consider changing your interface to
return an arrayref on success, and undef otherwise. An alternative
strategy is to throw anexception on error.

The long answer is that evaluating the function in list context (as
surely you are if you're expecting an array) means that an explicit
"return undef" yields a list with one member, whose value is undef;
and just "return" yields an empty list. You *might* be able to detect
errors by checking for "@result == 1 && not defined $return[0]", but
only if your application guarantees this sort of return value is invalid.

A list is a list is a list; if you want to return one you must define
what sort of list signals an error, because you are signaling in-band.

Hence my suggestion: return one value -- a reference to an array -- on
success, or no value -- "return" with no args -- on failure. This has
the nice feature of evaluating to true and false respectively when put
in an if:

     if (! $res_ref = my_func()) {
         # handle error
     }
     # data is in $res_ref->[0] etc.

My other suggestion was to throw an exceptio ('die "oh no!\n", or with
an actual error message). This gives you caller code like this:

     eval {
         my @result = my_func();     # returns a list now
         # code here assumes the call worked
     };
     if ($@) {
         die $@ unless $@ eq "oh no!\n" # propagate all other exceptions
         # handle the real failure here.
     }

Use whichever works best for you<tm>.

-- 
Gaal Yahas <gaal at forum2.org>
http://gaal.livejournal.com/



More information about the Perl mailing list