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

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

Replies are listed 'Best First'.
Re: Did I get what I expected (an array)?
by Abigail-II (Bishop) on Jul 16, 2002 at 17:31 UTC
    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) ;
      }