in reply to Passing different values into subroutines

I have got in to trouble before trying to pass multiple parms to a subroutine that are not scalars. I believe that perl internally concatenates all parameters into a single array.

As others have suggested, use references. To call a subroutine, I use:

thisIsMySub( \@onearray, \%ahasd, \@secondarray, $scalar1, $scalar2);
And in the subroutine itself, I use:
my @firstarray = @{shift }; my %somehash = %{shift }; my @secondadrray = @{shift }; my $scalarone = shift; my $scalartwo = shift;
I would gladly accept advice from others if there is a better way to do this.

Replies are listed 'Best First'.
RE: Re: Passing different values into subroutines
by chromatic (Archbishop) on Sep 01, 2000 at 08:37 UTC
    I believe that perl internally concatenates all parameters into a single array.

    Very close. Parameters are passed as a list. When you assign something to a list, there's no way for Perl to know how long the list is supposed to be, so it slurps up everything available. It's kinda like the greedy * operator that's come under fire recently (Death to Dot Star).

    If you need to get more than one list (whether list, array, or hash) to or from a subroutine, you need to use a reference, otherwise they'll blend together like a creamy fruit smoothie.

    Codewise, sometimes I explicitly dereference-and-copy my arguments like you do, and sometimes I just act on them directly:

    my $arr_ref = shift; foreach my $item (@$arr_ref) { $item .= "foo"; }