Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!uunet!van-bc!ubc-cs!phillips From: phillips@pacific.cs.ubc.ca (George Phillips) Newsgroups: comp.lang.perl Subject: Re: undef for lists Summary: make @a = undef undefine @a Message-ID: <7731@ubc-cs.UUCP> Date: 2 May 90 22:12:51 GMT References: <7676@ubc-cs.UUCP> <1990Apr27.191209.12150@iwarp.intel.com> Sender: news@cs.ubc.ca Organization: University of British Columbia, Vancouver, B.C., Canada Lines: 54 In article <1990Apr27.191209.12150@iwarp.intel.com> merlyn@iwarp.intel.com (Randal Schwartz) writes: >sub bub { # error return is (undef) > return shift ? @_ : (undef); >} > >sub try { > local(@ans) = &bub(@_); > if ((@ans != 1) || (defined $ans[$[])) { > print 0+@ans, " elements in @ans\n"; > } else { > print "an error return\n"; > } >} > > >&try(1,"a","normal","list"); >&try(1,"a single element"); >&try(1); # null list passed/returned >&try(0, "should","be","ignored"); # finally, trigger an error You don't need undef at all for your solution, just make sure that a non-empty list is returned for success and an empty list is returned for failure. The caller can act on () as failure and otherwise shift the list before using it. This is actually simpler for the caller because it only needs to test "shift @result". So, the rehacked (and very silly looking) version: sub bub { # error return is (), ok is (1, resultlist) shift ? unshift(@_, 1) : (@_ = ()); @_; } sub try { local(@ans) = &bub(@_); if (shift @ans) { print 0+@ans, " elements in @ans\n"; } else { print "an error return\n"; } } &try(1,"a","normal","list"); &try(1,"a single element"); &try(1); # null list passed/returned &try(0, "should","be","ignored"); # finally, trigger an error This works, but it sure would be nice if assignment to undef always undefines a variable. Subroutines returning arrays would be much cleaner and the language would make more sense. It's a feature I'd like to see unless it would require some major changes to perl. George Phillips phillips@cs.ubc.ca {alberta,uw-beaver,uunet}!ubc-cs!phillips