in reply to Re: problem unless I use ".="
in thread problem unless I use ".="

Actually, you get a syntax error there, but only because you're missing the if keyword :-)

But you're correct; you don't get a warning.  And that's because you're not trying to use the value of $baseball{yankees}, you're only modifying it (ie. appending to it).

Note that you do get a warning if $baseball{mets} is undefined, as in:

use strict; use warnings; my %baseball = ( orioles => "baltimore", twins => "minnesota" ); if ($baseball{yankees} .= $baseball{mets}) { foreach $_ (keys %baseball) { print "$_ => $baseball{$_}\n"; } } __END__ Use of uninitialized value in concatenation (.) or string at test.pl l +ine 10.

s''(q.S:$/9=(T1';s;(..)(..);$..=substr+crypt($1,$2),2,3;eg;print$..$/

Replies are listed 'Best First'.
Re^3: problem unless I use ".="
by cgmd (Beadle) on May 13, 2007 at 15:55 UTC
    Then what is being stated is that the line of code:
    if ( $baseball{yankees} = $baseball{yankees} . $baseball{mets}
    is not identical to:
    if ($baseball{yankees} .= $baseball{mets})
    Does this refute the original premise that: $a=$a <operator> $b; is same as $a <operator> = $b; (Taken from "Beginning Perl" by Lee & Cozens)?
      That's a good question, but you'll find it in the on-line documentation.

      From perlop (under Assignment Operators):

      Assignment operators work as in C. That is, $a += 2; is equivalent to $a = $a + 2; although without duplicating any side effects that dereferencing the lvalue might trigger

      It's that last part, about avoiding dereferencing side effects, that comes into play here.

      When you do:

      $baseball{yankees} = $baseball{yankees} . $baseball{mets};

      you are incurring a side effect of dereferencing $baseball{yankees}, namely testing for definedness, which you won't incur when you use the assignment operator:

      $baseball{yankees} .= $baseball{mets}

      s''(q.S:$/9=(T1';s;(..)(..);$..=substr+crypt($1,$2),2,3;eg;print$..$/

        Its not clear to me what the "avoiding dereferencing side effects" part of the documentation means exactly, however I feel pretty confident in saying that it isnt relevent here. When you do

        $hash{key}.=$str;

        there is no dereferencing going on. With

        $hash->{key}.=$str;

        there is, however it happens before the .= operator is involved, so it doesnt explain the special casing behaviour of .= and other mutator operators. It turns out that the documentation of this behaviour is not to be found in perlop, but rather in perlsyn (in the section Declarations):

        Operators such as ++, --, +=, -=, and .=, that operate on undefined le +ft values such as: my $a; $a++; are also always exempt from such warnings.

        Hope this clears things up for you.

        ---
        $world=~s/war/peace/g