Beefy Boxes and Bandwidth Generously Provided by pair Networks vroom
Just another Perl shrine
 
PerlMonks  

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

by davido (Archbishop)
on Aug 21, 2003 at 22:18 UTC ( #285604=note: print w/ replies, xml ) Need Help??


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

As you've pointed out, the comma is the list operator. It is evaluated left to right, so naturally if being asigned to a scalar lvalue, everything except for the right-most list item will be tossed out and replaced by the right-most item. In list context, it delimits the items in a list..

The => operator is mostly synonomous with the comma operator. It exists to provide cleaner reading of key=>value pairs, but can be used where a comma can be used in the creation of a list.

The . period operator, known as a string concatenation operator, does just that; it concatenates strings.

The . operator doesn't inherently create lists, nor does the , operator inherently create concatenated strings. It is accurate to observe that some functions and syntaxes will represent a list in a similar way to which it represents a string. The obvious example is print, where a list will be output the same way as a concatenated string. But do not mistake indistinguishable behavior in one context, for synonomous behavior. When you print a list, you are printing a list not a concatenated string. And when you print a concatenated string, you are not printing a list. The distinction may be difficult or impossible to detect in certain usages of statements such as print, but the distinction in general practice and theory is vastly different.

You would never create a list of elements to be assigned to an array by concatenating strings. You would never create a string by assigning it a list. There is no similarity between the two. There simply exist situations where the language acts similarly when given a string or a list; print being one of those situations.

Keeping concatenation, and list creation straight should be no more of a problem for people than most other features of the Perl syntax and lexicon.

Dave

"If I had my life to do over again, I'd be a plumber." -- Albert Einstein


Comment on Re: dot '.', comma ',' operators "oops" & "huh?"
Re: Re: dot '.', comma ',' operators "oops" & "huh?"
by davido (Archbishop) on Aug 21, 2003 at 22:41 UTC
    I should also point out that if you want to dispell the notion that the comma, and the period, are doing the same thing in the context of the print statement (or anywhere else for that matter), try this:

    #!/usr/bin/perl $, = "dad and "; print "Hi " . "mom!\n"; print "Hi " , "mom!\n";

    Dave

    "If I had my life to do over again, I'd be a plumber." -- Albert Einstein

Re: dot '.', comma ',' operators "oops" & "huh?"
by Abigail-II (Bishop) on Aug 22, 2003 at 08:20 UTC
    As you've pointed out, the comma is the list operator.

    What do you mean by that? Commas can construct lists, but only in list context. Commas in scalar context don't. Witness:

    #!/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

    Abigail

      The comma is still constructing a list, that simply has nowhere to go. Since the list is constructed left to right, the right-most element ends up being assigned to $a.

      UPDATE:

      It would appear that I'm incorrect in asserting that the thing on the right side of an equation that looks like this:

      $a = (1, 2, 3, 4);

      could be construed as being a list. And even more incorrect in saying that it is in scalar context.

      While I don't understand how it isn't a list (it's contained in (), it has commas, and it represents multiple values), I do understand that whatever term we can use to describe the Rvalue entity, we cannot say that it is a list in scalar context. This, to my understanding after reading merlyn's discussion threads is because a list is a list is a list, and scalars are scalars are scalars. The only possibly accurate description for the above code example, that I can come up with having read merlyn's words, are that it is the list is passing its rightmost element through the assignment operator ( = ) which is, itself, in scalar context. The entity on the right still looks like a list to me, but it is apparently accurate to assert that the comma operator knows whether the items it is affecting are being passed to a scalar or to an array. My prior supposition was that the assignment operator ( = ) was the one who understood things like context.

      I am nevertheless curious to see the internal representation of a statement such as the one above; not the 'perl -MO=Deparse' one, but still lower level, so that I can better understand the nature of such a statement. I can accept at face value the descriptions I've received from the Gods and Saints, but it is still appropriate to understand the internal character of ones' faith.

      Dave

      "If I had my life to do over again, I'd be a plumber." -- Albert Einstein

        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.
        ???

        Abigail

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://285604]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others meditating upon the Monastery: (4)
As of 2014-04-21 01:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (489 votes), past polls