Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery

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

by chunlou (Curate)
on Aug 21, 2003 at 21:28 UTC ( #285597=perlmeditation: print w/replies, xml ) Need Help??

This node falls below the community's threshold of quality. You may see it by logging in.
  • Comment on dot '.', comma ',' operators "oops" & "huh?"

Replies are listed 'Best First'.
Re: dot '.', comma ',' operators "oops" & "huh?"
by Abigail-II (Bishop) on Aug 21, 2003 at 22:00 UTC
    According to perlop POD, "." an additive operator concatenates two strings, whereas comma operator "," in "scalar context it evaluates its left argument, throws that value away, then evaluates its right argument and returns that value."

    Yeah, but what is your point? None of your examples use the comma operator in scalar context.

    In practice, a lot of people use "." and "," interchangeably.

    Actually, they don't, because in most cases, they lead to totally different things. About the only places where they are used more or less interchangeably are as arguments to functions, where the function concatenates all its arguments. print, warn and die are the most noteworthy. But here we talk about the comma as a list constructor, where the operator is in list context. Here the difference between the comma and the dot operators is that the comma operator gives list context to its operands, where the dot operator gives scalar context to its operands.


Re: dot '.', comma ',' operators "oops" & "huh?"
by davido (Cardinal) on Aug 21, 2003 at 22:18 UTC
    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.


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

      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";


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

      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


      A reply falls below the community's threshold of quality. You may see it by logging in.
Re: (content removed from 285597)
by sauoq (Abbot) on Aug 22, 2003 at 22:06 UTC

    Please note that, as I reply to this node, its content, including its title, has been removed. Perhaps it will be restored, in which case this reply would seem insane without this note here explaining things... :-)

    Boo! Hiss!

    Removing the content of a node which has several replies does the users of this site a huge disservice, chunlou. Now, all these replies are floating in limbo, void of context.

    So what if the OP was a little boneheaded and its rep was negative? Isn't it better to own up to your mistakes than to try to hide them?

    You have the ability and the right to remove the content you post here... but that doesn't make it right to do it.

    "My two cents aren't worth a dime.";

      He did the same to [untitled node, ID 285414], which was duckies.

      Apparently, after a comment on credits, the post got downvoted and he decided to remove it the hard way.

      Strange enough, in thepen's mirror this page is not recorded.

      Shame on him, anyway!

      Oh, BTW, he's also removed the picture in his home page. What should we infer from that?

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlmeditation [id://285597]
Approved by diotalevi
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (2)
As of 2023-06-02 01:31 GMT
Find Nodes?
    Voting Booth?

    No recent polls found