On Oct 31, Roy Peters said:

>Is there any way to return 2 or 3 scalar variables from a subroutine (like
>passing a variable by reference in C)?
>
>I would like to avoid returning an array, if possible, because it makes
>the script very non-intuitive. 

Subroutines can return any number of arguments.  You can even make a
function determine whether you called it as

  $value = func();

or

  ($this, $that) = func();

so that you can return a specific single value, or a list.  Take the
localtime() function as an example:

  $date_string = localtime;
  @date_parts = localtime;

That's done via the wantarray() function (which is a misnomer -- it should
be wantlist()):

  sub func {
    return "A B" if wantarray;
    return ("A", "B");
  }

When we use the func() code above, we set $value to "A B", and $this to
"A" and $that to "B".

As for returning things in general, you can return whatever you want.  In
most cases, there's no difference between returning an array and returning
a list.  If you're assigning to a list, they're pretty interchangeable:

  sub list { return ('a', 'b', 'c') }
  sub array { my @r = ('a', 'b', 'c'); return @r }

  ($this, $that, $those) = list();
  ($his, $hers, $theirs) = array();
  @mine = list();
  @yours = array();

There's no real difference here.  There's no reason a function that
returns an array must return those values to ANOTHER array.

There is a small (but important) difference, though.  When you call a
function in scalar context (like: $x = func()), returning an array causes
you to return the NUMBER OF ELEMENTS in the array:

  sub array { my @r = ('a', 'b', 'c'); return @r }
  @elements = array();  # 'a', 'b', 'c'
  $size = array();      # 3

Compare that with return a list (or trying to):

  sub array { return ('a', 'b', 'c') }
  @elements = list();  # 'a', 'b', 'c'
  $last = list();      # 'c'

That is the proper behavior, since using the comma operator in scalar
context returns the right-most term.

That's all for now... if you want to read more about context, you can
check out an article I'm written:

  http://www.pobox.com/~japhy/articles/pm/2000-02.html

-- 
Jeff "japhy" Pinyan      [EMAIL PROTECTED]      http://www.pobox.com/~japhy/
RPI Acacia brother #734   http://www.perlmonks.org/   http://www.cpan.org/
** Look for "Regular Expressions in Perl" published by Manning, in 2002 **


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to