in reply to Re^2: foreach localizing variables
in thread foreach localizing variables

My previous post wasn't quite accurate. The my $value marks that variable as lexical for the current scope, but a for() loop argument context gets its own store ("scratchpad", see perlguts), as is the case for subroutines. So, although at compilation the my() declaration extends into the sub, the variable inside the sub gets allocated on a different scratchpad, but is also marked as lexical (PADMY):
use Devel::Peek; my $value = "four"; my @array = ( "one" ); warn "(1):\n" ; Dump($value); foreach $value (@array) { warn "(2):\n" ; Dump($value); print "foreach value: $value\t"; function(); sub function { warn "(3):\n" ; Dump($value); print "function value: $value\n"; } } __END__ (1): SV = PV(0x8b83b00) at 0x8b83768 REFCNT = 1 FLAGS = (PADBUSY,PADMY,POK,pPOK) PV = 0x8b992c8 "four"\0 CUR = 4 LEN = 8 (2): SV = PV(0x8b83c20) at 0x8b82c28 REFCNT = 2 FLAGS = (POK,pPOK) PV = 0x8b962c0 "one"\0 CUR = 3 LEN = 4 (3): SV = NULL(0x0) at 0x8b837b0 REFCNT = 2 FLAGS = (PADBUSY,PADMY) foreach value: one function value:

As you can see, all addresses of $value are different. The my() just tells the compiler that the symbol $value is to be treated as a lexical variable for the scope in which it was declared, but that doesn't mean it has always the same storage (or only one address location). <update> The $value inside the sub inside the for() loop gets its own $value because the outer $value isn't visible in the scope in which it has been compiled.</update> Bare blocks are different:

use Devel::Peek; my $value = "four"; warn "(1):\n" ; Dump($value); { $value = "five"; warn "(2):\n" ; Dump($value); } __END__ (1): SV = PV(0x8bcdb00) at 0x8bcd75c REFCNT = 1 FLAGS = (PADBUSY,PADMY,POK,pPOK) PV = 0x8bee7d0 "four"\0 CUR = 4 LEN = 8 (2): SV = PV(0x8bcdb00) at 0x8bcd75c REFCNT = 1 FLAGS = (PADBUSY,PADMY,POK,pPOK) PV = 0x8bee7d0 "five"\0 CUR = 4 LEN = 8
Welcome to The Monastery, btw ;-)

--shmem

_($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                              /\_¯/(q    /
----------------------------  \__(m.====·.(_("always off the crowd"))."·
");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}