如何在不使用for循环的情况下完全重置哈希?

Str*_*ure 17 perl hash

我想完全重置我的%hash所以它根本不包含键或值.我更喜欢使用单线而不是使用循环.

到目前为止,我尝试过:

%hash = 0;
%hash = undef;
Run Code Online (Sandbox Code Playgroud)

但是这些都在严格模式下抛出错误并启用了警告,所以我写了一个简单的for循环来实现同样的事情:

for (keys %hash) {
    delete $hash{$_};
}
Run Code Online (Sandbox Code Playgroud)

这有效,但我真的想用一个班轮做这件事.有没有办法简单地重置我忽略的哈希?

raf*_*afl 37

双方%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
Run Code Online (Sandbox Code Playgroud)

MAX在田野PVHVs为最重要的一点.

  • 这并不是关于散列中存储的值的确切含义,而是关于它们中有多少值.分配,释放,然后再次分配一些内存以在散列中存储值并不是你能做的最快的事情,因此perl假设散列最终会再次增长到其原始大小,即使它被清除了` %h =()`,并保持在哈希中存储尽可能多的元素所需的内存,除非明确要求不这样做.这不要与哈希中实际值占用的内存相混淆. (11认同)
  • 实际上,Devel :: Peek并不能告诉你什么更有效率.这就是你的大脑所针对的.如果你要清除一个有65个成员的哈希,并且只是要把65个成员放进去,那么你也可以重用内存.如果要清除其中包含超过9000个条目的哈希,并且只想拥有三个,那么确定...时间清除它. (2认同)