开发者

How can I reset a hash completely without using a for loop?

开发者 https://www.devze.com 2023-01-17 16:53 出处:网络
I would like to completely reset my %hash so that it does not contain keys or values at all. I prefer to use a one-liner than have to use a loop.

I would like to completely reset my %hash so that it does not contain keys or values at all. I prefer to use a one-liner than have to use a loop.

So far I have tried:

%hash = 0;
%hash = undef;

But these both throw errors in strict mode with warnings enabled, so I wrote a simple for loop to achieve the same thing:

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

This works but I would really like to do this with a one-liner. Is there a way to simply reset a hash that I am overloo开发者_C百科king?


Both %hash = (); and undef %hash; will work, with the difference that the latter will give back some memory to use for other things. The former will keep the memory the things in the hash used before, assuming it'll be used again later anyway, when the hash is being refilled.

You can use Devel::Peek to observe that behaviour:

$ 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

The MAX fields in the PVHVs are the important bit.


How about

%hash = ();


You can use undef:

undef %hash;


You can do:

%hash = ();


Use

%hash = ();


%hash = (); must work


Since the OP asked for a one liner that works with use strict and warnings

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

精彩评论

暂无评论...
验证码 换一张
取 消