in reply to Re: Why Perl gets confused here?
in thread Why Perl gets confused here?

Thank you for explanation.

use strict; use warnings; use feature 'say'; use Devel::Peek; my $p = 'abc'; my $q = 'abc'; Dump(( substr $p, 0, 1 ) = '123' ); Dump( time ); (( substr( $q, 0, 1 )) = '123' ) = 'x'; say $q; #substr(( time ), 0, 1 ) = 'x';

SV = IV(0xa72034) at 0xa72034 REFCNT = 1 FLAGS = (PADTMP,IOK,pIOK) IV = 1 SV = IV(0xa8bb44) at 0xa8bb44 REFCNT = 1 FLAGS = (PADTMP,IOK,pIOK) IV = 1509111305 xbc

Shouldn't the return value of list assignment operator be treated as constant, then? I tried to "sneak" various types of constants or constant-producing expressions as arg to lvalue-substr, but Perl reports compile time error (commented line).

More confusing is "xbc" -- I'd expect $q to be "123bc", and "x" to be gone into fathomless void, as in OP?

Replies are listed 'Best First'.
Re^3: Why Perl gets confused here?
by LanX (Saint) on Oct 27, 2017 at 14:18 UTC
    Context matters.

    This is list context  (( substr( $q, 0, 1 )) = '123' ) = 'x';

    But the OP happened in scalar context, see Ikegami's footnote.

    "substr evaluates its first operand in scalar context."

    > More confusing is "xbc" -- I'd expect $q to be "123bc", and "x" to be gone into fathomless void, as in OP?

    Depending on your Perl version you can assign multiple times to the same lvalue.

    in this case first 123 then x

    See substr documentation

    Note that the lvalue returned by the three-argument version of substr acts as a 'magic bullet'; each time it is assigned to, it remembers which part of the original string is being modified

    To avoid confusion, I'd suggest using the 4 parametric version instead of the lvalue variant.

    Cheers Rolf
    (addicted to the Perl Programming Language and ☆☆☆☆ :)
    Je suis Charlie!