Оба %hash = ();
и undef %hash;
будут работать, с той разницей, что последний вернет часть памяти для других целей.Первый сохранит в памяти те вещи, которые использовались ранее в хэше, при условии, что он все равно будет использован позже, когда хэш будет пополняться.
Вы можете использовать Devel::Peek
, чтобы наблюдать такое поведение:*
$ perl -MDevel::Peek -we'my %foo = (0 .. 99); %foo = (); Dump \%foo; undef %foo; Dump \%foo'
SV = IV(0x23b18e8) at 0x23b18f0
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x23acd28
SV = PVHV(0x23890b0) at 0x23acd28
REFCNT = 2
FLAGS = (PADMY,SHAREKEYS)
ARRAY = 0x23b5d38
KEYS = 0
FILL = 0
MAX = 63
RITER = -1
EITER = 0x0
SV = IV(0x23b18e8) at 0x23b18f0
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x23acd28
SV = PVHV(0x23890b0) at 0x23acd28
REFCNT = 2
FLAGS = (PADMY,SHAREKEYS)
ARRAY = 0x0
KEYS = 0
FILL = 0
MAX = 7
RITER = -1
EITER = 0x0
Поля MAX
в PVHV
s являются важным битом.