in reply to Re^2: What does my @x= (undef)x7; do?
in thread What does my @x= (undef)x7; do?
What’s going on?
The explicit method populates the array with 7 physical pointers to undef:
[0] Perl> @x = (undef)x7;; [0] Perl> use Devel::Peek;; [No such file or directory] Perl> Dump \@x;; SV = RV(0x3c735d0) at 0x3c735c0 REFCNT = 1 FLAGS = (TEMP,ROK) RV = 0x3c6ac88 SV = PVAV(0x3cfafd8) at 0x3c6ac88 REFCNT = 2 FLAGS = (RMG) MAGIC = 0x3cee198 MG_VIRTUAL = &PL_vtbl_arylen_p MG_TYPE = PERL_MAGIC_arylen_p(@) MG_FLAGS = 0x02 REFCOUNTED MG_OBJ = 0x3c6a410 SV = PVMG(0x3b1a078) at 0x3c6a410 REFCNT = 1 FLAGS = (GMG,SMG,pIOK) IV = 6 NV = 0 PV = 0 MAGIC = 0x3ceea08 MG_VIRTUAL = &PL_vtbl_arylen MG_TYPE = PERL_MAGIC_arylen(#) MG_OBJ = 0x3c6ac88 ARRAY = 0x3cf1398 FILL = 6 MAX = 7 ARYLEN = 0x3c6a410 FLAGS = (REAL) Elt No. 0 SV = NULL(0x0) at 0x3cb4b98 REFCNT = 1 FLAGS = () Elt No. 1 SV = NULL(0x0) at 0x3c73578 REFCNT = 1 FLAGS = () Elt No. 2 SV = NULL(0x0) at 0x3cb49b8 REFCNT = 1 FLAGS = () Elt No. 3 SV = NULL(0x0) at 0x3cb4af0 REFCNT = 1 FLAGS = ()
Whereas, when you pre-extend the array, no physical pointer are populated; the undef's are implied by the absence of pointers:
[0] Perl> undef @x;; [0] Perl> $#x = 6;; [0] Perl> Dump \@x;; SV = RV(0x3c735d0) at 0x3c735c0 REFCNT = 1 FLAGS = (TEMP,ROK) RV = 0x3c6ac88 SV = PVAV(0x3cfafd8) at 0x3c6ac88 REFCNT = 2 FLAGS = (RMG) MAGIC = 0x3cee198 MG_VIRTUAL = &PL_vtbl_arylen_p MG_TYPE = PERL_MAGIC_arylen_p(@) MG_FLAGS = 0x02 REFCOUNTED MG_OBJ = 0x3c6a410 SV = PVMG(0x3b1a078) at 0x3c6a410 REFCNT = 1 FLAGS = (GMG,SMG,pIOK) IV = 6 NV = 0 PV = 0 MAGIC = 0x3ceea08 MG_VIRTUAL = &PL_vtbl_arylen MG_TYPE = PERL_MAGIC_arylen(#) MG_OBJ = 0x3c6ac88 ARRAY = 0x3cf1398 FILL = 6 MAX = 6 ARYLEN = 0x3c6a410 FLAGS = (REAL) Elt No. 0 Elt No. 1 Elt No. 2 Elt No. 3
Perl code would treat the two the as the same, but user-written XS code makes assumptions.
Thanks for checking it.
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^4: What does my @x= (undef)x7; do?
by betterworld (Curate) on Nov 09, 2015 at 17:53 UTC | |
by AnomalousMonk (Archbishop) on Nov 09, 2015 at 18:34 UTC | |
by BrowserUk (Patriarch) on Nov 10, 2015 at 04:55 UTC | |
by betterworld (Curate) on Nov 10, 2015 at 09:04 UTC | |
by BrowserUk (Patriarch) on Nov 10, 2015 at 11:34 UTC | |
by AnomalousMonk (Archbishop) on Nov 10, 2015 at 17:46 UTC | |
by BrowserUk (Patriarch) on Nov 10, 2015 at 17:58 UTC | |
by AnomalousMonk (Archbishop) on Nov 10, 2015 at 18:42 UTC | |
|