chiggly007 has asked for the wisdom of the Perl Monks concerning the following question:

I have a general question about concatenation. I was under they impression that I could concatenate using a . , etc. I'm confused why this wont work:
print "Counting up: " . (1..6) . "\n";
but instead this works:
print "Counting up: " , (1..6) , "\n";

Replies are listed 'Best First'.
Re: Question about concatenation
by eyepopslikeamosquito (Archbishop) on Dec 23, 2012 at 20:27 UTC

    The difference is because the range operator behaves differently in list context to scalar context. BTW, so do arrays. As indicated in the test program below, the array returns the number of elements in scalar context, while the flip flop operator returns false (represented as undef), which prints as an empty string. Running:

    use strict; use warnings; print "Counting up: " . (1..6) . "\n"; # scalar context (undef) print "Counting up: " , (1..6) , "\n"; # list context print "Counting up: @{[1..6]}\n"; # list context, space bet +ween each element my @one_to_six = 1..6; print "Counting up: " . @one_to_six . "\n"; # scalar context (no. of +elts) print "Counting up: " , @one_to_six , "\n"; # list context
    produces:
    Use of uninitialized value $. in range (or flip) at cnt.pl line 4. Counting up: Counting up: 123456 Counting up: 1 2 3 4 5 6 Counting up: 6 Counting up: 123456

Re: Question about concatenation
by LanX (Saint) on Dec 23, 2012 at 20:21 UTC
    the dot . is a scalar operator expecting something convertible to a string.

    from perlop: Binary "." concatenates two strings.

    print operates on lists and the comma is the necessary list operator to delimit the elements.

    try

    print "Counting up: " . join ( "", 1..6 ) . "\n";

    or

    @arr=1..6; print "Counting up: @arr\n";

    Cheers Rolf

Re: Question about concatenation
by toolic (Bishop) on Dec 23, 2012 at 20:24 UTC