Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical

Re: dot '.', comma ',' operators "oops" & "huh?"

by Abigail-II (Bishop)
on Aug 22, 2003 at 21:53 UTC ( #285935=note: print w/replies, xml ) Need Help??

in reply to Re: Re: dot '.', comma ',' operators "oops" & "huh?"
in thread dot '.', comma ',' operators "oops" & "huh?"

The comma is still constructing a list, that simply has nowhere to go.

No, sir, it does not. To quote merlyn: There are no lists in scalar context. And to repeat my code fragment:

#!/usr/bin/perl use strict; use warnings; sub context { print wantarray ? "LIST\n" : "SCALAR\n" } my @a = (context, context); my $a = (context, context); __END__ LIST LIST SCALAR SCALAR

If the comma would construct a list in scalar context, could you please explain why the code above prints SCALAR twice?

in scalar context, the list constructor creates a list

Repeat after me: There are no lists in scalar context.

The operator isn't overloaded for each possible context.

This is Perl, not C++. Operators aren't overloaded by itself, although they might if one of their operands is an object. But that's not the case we are discussing. The comma operator does, however, behave different in scalar than in list context. man perlop clearly discusses the two cases:

Comma Operator Binary "," is the comma operator. In scalar context it evaluates its left argument, throws that value away, then evaluates its right argument and returns that value. This is just like C's comma operator. In list context, it's just the list argument separator, and inserts both its arguments into the list.

Note how it does not talk about lists when discussing the comma operator in scalar context.

It's operating on the list, but the list's subjects aren't being assigned except for the last one, because there's only one slot for them to fit into.

Then explain this warning:

$ perl -wle 'my $a = (2, 3)' Useless use of a constant in void context at -e line 1.

Note how it says void context. Make sure that your explaination also explains why the following doesn't give a warning:

$ perl -wle 'my ($a) = (2, 3)'

Here's an example:
my $a = ( ++$x, ++$y );
But both sides were evaluated as is evidenced by the fact that both $x and $y incremented.

That both sides are being evaluated isn't what's being discussed. The comma in scalar context evaluates both operands, and that's what we are seeing here. But evaluating both operands does not make a list - addition evaluates both operands as well, and that doesn't create a list either.

my $x; my ( $a, $b, $c ) = ( ++$x, ++$x, ++$x, ++$x ); print "$a, $b, $c\n";

That's undefined behaviour. Perhaps you want something like:

my $x = 1; my $y = 2; my $z = 3; my $w = 4; my ($a, $b, $c) = (++ $x, ++ $y, ++ $z, ++ $w); print "$a, $b, $c\n"; __END__ 2, 3, 4

Note that the comma operator is now in list context, and that $a, $b and $c are assigned to the first three elements of the list.

I guess my point to all this is that the commas construct lists in both list and scalar context,

There's no list in scalar context.

but a list is only returned in scalar context.


Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://285935]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (7)
As of 2017-05-30 11:24 GMT
Find Nodes?
    Voting Booth?