in reply to Re: Re: Returning multiple values from a function
in thread Returning multiple values from a function

ok thanks for your input. I corrected the problem in a doofangled way.. I passed type by reference to the function and only returned the hash. I don't know if I like it but it works atm.

Be careful about what you pass around, and what you return. As others already said, your parameter list gets flattened out into a list. If you return a hash, the hash gets flattened out, but if you accept the results of the call back into hash, then you are all right. NOTE: This all changes if you have a hash as one of many parameters that you are passing to a subroutine, or returning from a subroutine. If you are passing mixed parameters (scalars, lists, hashs), then your subroutine can get confused.

The safest way to pass (or return) arrays and hashes is by reference. This keeps your parameter list all scalars, since a reference is a scalar.

sub test { my $scalar1 = shift; my $array2_ref = shift; my $hash3_ref = shift; ### if you want to work with the hash, and not just ### the hash reference, then dereference the ref. my %hash3 = %$hash3_ref; print "value for hash key 'one' is $hash3{'one'}\n"; ### I prefer to just use the reference instead, and ### not create the hash by dereferencing the hash ref. print "value for hash key 'one' is $hash3_ref->{'one'}\n"; return($scalar1, $array2_ref, $hash3_ref); } my $test_scalar = "abc"; my @test_array = ( "a", "b", "c" ); my %test_hash = ( "a" => 1, "b" => 2, "c" => 3 ); ($new_scalar, $new_arrayref, $new_hashref) = test($test_scalar, \@test +_array, \%test_hash);
Sorry, now that I've preview'd my response, I can't see what your next question was.

HTH.

Replies are listed 'Best First'.
Re: Re: Re: Re: Returning multiple values from a function
by Grygonos (Chaplain) on Sep 03, 2003 at 20:37 UTC
    fyi, exactly what I did was this
    my $type; %results = findResults(\$type);

    $type is then modified inside findResults() but only the hash is passed back to the caller. So the value of $type is changed but never passed back,so as to avoid slurpage


    Is this ok style? or is that a little too C++?

    You can return only a scalar or a list from a function. To get a hash return, you either have to flatten it into a list (and reconstruct it at the other side) or return a reference to the hash

    I haven't found this to be so, unless perl is taking care of the reconstruction for me. I returned a hash like so  return %results; and the calling hash was populated correctly. I was able to do a foreach over each of the keys i had set. Perl is taking care of the reconstruction correct?

      I haven't found this to be so, unless perl is taking care of the reconstruction for me. I returned a hash like so return %results; and the calling hash was populated correctly. I was able to do a foreach over each of the keys i had set. Perl is taking care of the reconstruction correct?

      Yes, Perl takes care of that for you. The sub returns a list of values from the hash, and the assignment turns that list back into a hash. (You could return a hash, and assign to an array, you'd then get an array containing the keys and values of the hash, alternated.)

      That make any sense?

      C.