Как я могу сбросить хэш полностью без использования цикла for? - PullRequest
17 голосов
/ 28 сентября 2010

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

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

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

Ответы [ 7 ]

37 голосов
/ 28 сентября 2010

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

7 голосов
/ 28 сентября 2010

Как насчет

%hash = ();
5 голосов
/ 28 сентября 2010

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

undef %hash;
2 голосов
/ 28 сентября 2010

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

%hash = ();
2 голосов
/ 28 сентября 2010

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

%hash = ();
1 голос
/ 28 сентября 2010

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

0 голосов
/ 28 июня 2013

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

delete $hash{$_} for (keys %hash)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...