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

I really do not understand what you are trying to do. In your test program, you are getting 1 in scalar context, and ("test") in list context. And that's ok. Could you give an example of what in your eyes in a failure?

Also, in your title, you suggest that you want the function to return an array, but in the text, you talk about returning a list. A list, and not a scalar. But this is very confusing. First, a function can not return an array. A function returns either a scalar, or a list. What it returns is determined by the context, and the context alone. A scalar will be returned in scalar context, and a list will be returned in list context. The return @x in the test function never returns an array - it returns a scalar in scalar context, and a list (consisting of the elements of @x) in list context.

BTW, what is your fear of modules?

Abigail

Replies are listed 'Best First'.
Re: Re: Did I get what I expected (an array)?
by Anonymous Monk on Jul 16, 2002 at 16:35 UTC

    Ok, I'll try a better translation from my thoughts in italian to a better english :-)

    Maybe I should restate the question this way:

    is it possible , and how, to distinguish if a sub/method is returning a single scalar (

    return $this
    , which my test script should consider wrong) or a list (return ($this) or return qw(a bunch of values)) or an array (return @this) which my test script should both consider good?

    I'm writing a test script (one of those that make test runs) that checks if a class of mine or a subclass of it behaves like it should.

    My check detects the case return @this but fails on return qw(this list).

    use strict ; use warnings ; sub test { return ('a','test') } my $test = test() ; my @test = test() ; print ">>> $test\n" ; print map "[$_]\n",@test ; print $test == scalar(@test)? "Yepa!\n" : "Nope!\n" ;

    This one fails:

    $ perl test.pl >>> test [a] [test] Argument "test" isn't numeric in numeric eq (==) at test.pl line 11. Nope!

    (even if I consider test's return value ok for my class...)

    I hope I explained now. Do I?

    Ciao!
    --bronto

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

      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

        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) ;
        }