in reply to Re^2: unexpected modify hash in a distance with grep { $_ } (inconsistent behaviour of aliasing)
in thread unexpected modify hash in a distance with grep { $_ }
However, function call arguments which are hash subscripts are special-cased. Although function args are technically always in lvalue context (e.g. the sub about to be called might do sub f { $_[0]++ }, who knows!), perl tries to avoid auto-vivification by deferring hash lookup. Instead, if you do foo($h{$k}) then rather than looking up the hash value and passing it as an arg, perl creates a special proxy object (PVLV) which holds pointers to $h and the key and passes that instead. For example:
If this PVLV values is assigned to then it autovivifies the hash. If it is just read, it doesn't. It behaves kinda like a tied variable. Personally I don't like like this behaviour much, but it was added in 5.004, before my time as a p5 porter.$ perl -MDevel::Peek -e'sub f { Dump $_[0] } f($h{akey})' SV = PVLV(0xd28a78) at 0xcb2658 REFCNT = 1 FLAGS = (GMG,SMG) IV = 0 NV = 0 PV = 0 MAGIC = 0xce9828 MG_VIRTUAL = &PL_vtbl_defelem MG_TYPE = PERL_MAGIC_defelem(y) MG_FLAGS = 0x02 REFCOUNTED MG_OBJ = 0xcb2820 SV = PV(0xcb2ed8) at 0xcb2820 REFCNT = 1 FLAGS = (POK,pPOK) PV = 0xce97f8 "akey"\0 CUR = 4 LEN = 10 TYPE = y TARGOFF = 0 TARGLEN = 1 TARG = 0xce1a80 FLAGS = 0 SV = PVHV(0xcb8218) at 0xce1a80 REFCNT = 2 FLAGS = (SHAREKEYS) ARRAY = 0x0 KEYS = 0 FILL = 0 MAX = 7
Dave.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: unexpected modify hash in a distance with grep { $_ } (inconsistent behaviour of aliasing)
by LanX (Saint) on Dec 20, 2019 at 22:57 UTC | |
by dave_the_m (Monsignor) on Dec 21, 2019 at 00:01 UTC | |
by LanX (Saint) on Dec 21, 2019 at 18:50 UTC | |
|
Re^4: unexpected modify hash in a distance with grep { $_ } (inconsistent behaviour of aliasing)
by Anonymous Monk on Dec 21, 2019 at 16:42 UTC | |
by Anonymous Monk on Dec 21, 2019 at 20:23 UTC |