It does indeed clear the array, but it does not free it the underlying buffer.
Setting $#a extends the visible size of the array, not just the internal one. The elements I proceeded to push onto the array were getting added after the 12 mil empty ones.
@a=(); empties the visible array, but doesn't deallocate the internal buffer like undef @a; does.
$ perl -MDevel::Peek -e'
my @a = qw( a b c ); Dump(\@a,1);
@a=(); Dump(\@a,1);
undef(@a); Dump(\@a,1);
'
SV = IV(0x816ce54) at 0x816ce58
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x817bc50
SV = PVAV(0x816d038) at 0x817bc50
REFCNT = 2
FLAGS = (PADMY)
ARRAY = 0x817b500
FILL = 2 <---- 3 elements
MAX = 3 <---- 4 slots
ARYLEN = 0x0
FLAGS = (REAL)
SV = IV(0x816c154) at 0x816c158
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x817bc50
SV = PVAV(0x816d038) at 0x817bc50
REFCNT = 2
FLAGS = (PADMY)
ARRAY = 0x817b500
FILL = -1 <---- 0 elements
MAX = 3 <---- 4 slots
ARYLEN = 0x0
FLAGS = (REAL)
SV = IV(0x816c154) at 0x816c158
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x817bc50
SV = PVAV(0x816d038) at 0x817bc50
REFCNT = 2
FLAGS = (PADMY)
ARRAY = 0x0 <---- No array allocated
FILL = -1 <---- 0 elements
MAX = -1 <---- 0 slots
ARYLEN = 0x0
FLAGS = (REAL)
If you don't want to rely on that, you could do
my @lines;
$#lines = 12_000_000;
$lines[$.-1] = $_ while <>;
$#lines = $.-1;
|