Как я могу reset хэш полностью без использования цикла for?

Я хотел бы полностью reset my %hash, чтобы он вообще не содержал ключей или значений. Я предпочитаю использовать однострочный, чем использовать цикл.

До сих пор я пробовал:

%hash = 0;
%hash = undef;

Но они оба бросают ошибки в строгом режиме с включенными предупреждениями, поэтому я написал простой цикл для достижения того же:

for (keys %hash) {
    delete $hash{$_};
}

Это работает, но я бы очень хотел сделать это с помощью однострочного интерфейса. Есть ли способ просто reset хеш, который я пропускаю?

Ответы

Ответ 1

Оба %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 являются важным битом.

Ответ 2

Как насчет

%hash = ();

Ответ 3

Вы можете использовать undef:

undef %hash;

Ответ 4

Использование

%hash = ();

Ответ 5

Вы можете сделать:

%hash = ();

Ответ 6

% hash =(); должен работать

Ответ 7

Поскольку OP запросил один лайнер, который работает с использованием строгих правил и предупреждений

delete $hash{$_} for (keys %hash)