On Tue, Sep 16, 2014 at 1:45 PM, Paul Johnson <p...@pjcj.net> wrote:

> The comma operator evaluates its LHS, throws it away, evaluates its RHS
> and returns that.  The comma operator is left associative (see perlop).
>
> So the result of evaluating the RHS (1, 2, 3) is:
>
>   (1, 2, 3) -> ((1, 2), 3) -> (2, 3) -> 3
>
> And this is why $one_var gets the value 3 - not because there are three
> elements in a list on the RHS.
>

D'oh! Somewhere I knew something like that, that a list in scalar context
ends up assigning the last element to the scalar - though I'm pretty sure I
didn't know it was due to the comma operator.  I should have though, as:
# perl -we 'my $one = (3,2,1); print "$one\n"'
Useless use of a constant in void context at -e line 1.
Useless use of a constant in void context at -e line 1.
1

Those two warnings are the "dropping" of the result of the first to comma
operations.  Hmm, so this works [1]:

my $second_elem = ('first', 'second', 'third')[1];
$second_elem eq 'second';

because ...???

> This all becomes easier to understand if you don't use the values 1, 2
and 3 :)

I "knew" that was a bad idea ... just not enough to not use it.
$ perldoc -q 'difference between a list and an array'
...
As a side note, there’s no such thing as a list in *scalar context*.  When
you say

           $scalar = (2, 5, 7, 9);

       you’re using the comma operator in *scalar context*, so it uses the
scalar comma operator.  There never was a list there at all!  This causes
the last value to be returned: 9.

Well, I would've found that if perldoc would've found this for queries on
"scalar context", "list context", "array context" or, for that matter,
plain old "context" but ..


-- 

a

[1]
perl -we 'my $s_e = ("x", "y", "z")[1]; print "$s_e\n"'

same as:
perl -we 'my $s_e = qw(x y z)[1]; print "$s_e\n"'

and:
perl -we 'my ($s_e) = qw(x y z)[1]; print "$s_e\n"'



Andy Bach,
afb...@gmail.com
608 658-1890 cell
608 261-5738 wk

Reply via email to