in reply to Re: Re: Did I get what I expected (an array)?
in thread Did I get what I expected (an array)?

Yes, you explained what you want. It's also clear you lack some fundamental knowledge about Perl. You need to make yourself more familiar with the concept context. A subroutine will return a list if and only if it was called in list context. A subroutine will return a scalar if and only if it was called in scalar context. A subroutine will return nothing if and only if it was called in void context. The crucial point is that it is the context that determines whether the subroutine returns a list or a scalar - not the subroutine.

Furthermore, parenthesis do not create lists (except in some very specific syntax constructs). Parenthesis are used for grouping.

return $this; return ($this); return (($this)); return ((($this)));
all mean the same. The do not differ just like there is no difference between:
3 + 4; (3 + 4); (3) + (4); ((3) + (4));
As for
return @x;
that will return the number of elements of @x in scalar context, and a list consisting of the elements of @x in list context. Perl will never return an array. You can check for yourself:
my @x = qw /foo bar baz/; sub my_func {return @x}; (my_func) [1] .= "hello";
This gives a compile error:
Can't modify list slice in concatenation (.) or string
Note that it says "list slice". A list, not an array.

Abigail

Replies are listed 'Best First'.
Re: Re: Did I get what I expected (an array)?
by bronto (Priest) on Jul 17, 2002 at 08:21 UTC

    First of all: thanks Abigail!

    Second: sorry for posting as Anonymous Monk, unfortunately Konqueror had me and broke my authentication. If I can recover that node by any mean I'll be thankful

    Now back to Perl. Actually I am guilty, yes, but not of the sin you are accusing me :-). I didn't get, and probabily I still have to meditate about, the difference between lists and arrays. But I know what "context" means.

    Otherwise, I wouldn't write:

    $test = test() ; @test = test() ; print $test == scalar(@test)? "Yepa!\n" : "Nope!\n" ;

    The idea under that snippet was: retrieve in scalar context and in list context; if $test matches scalar @test then surely we return @x.

    About the return thing, you got a point: I forgot the golden rule if it seems a function, it is a function; moreover, I remembered return LIST from the docs, but it's return EXPR. I'm a sinner ;)

    Last but not least, for everybody telling me about wantarray: you completely missed the point, but it probabily was my english's fault. I didn't tell I was looking for a way to write a better return statement. Instead, I was trying to test a return value of a sub/method, whoever wrote it. I can't enforce wantarray usage on people that is subclassing a class of mine.

    Anyway, another lesson learnt. Thanks to everybody

    Ciao!
    --bronto

    # Another Perl edition of a song:
    # The End, by The Beatles
    END {
      $you->take($love) eq $you->made($love) ;
    }