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

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

Replies are listed 'Best First'.
Re^4: problem unless I use ".="
by liverpole (Monsignor) on May 13, 2007 at 16:32 UTC
    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