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

时间:2010-09-28 07:25:39

标签: perl hash

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

到目前为止,我已经尝试过:

%hash = 0;
%hash = undef;

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

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

这样可行,但我真的很想用单行做这件事。有没有办法简单地重置我忽略的哈希?

7 个答案:

答案 0 :(得分: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

MAX中的PVHV字段非常重要。

答案 1 :(得分:7)

怎么样

%hash = ();

答案 2 :(得分:5)

您可以使用undef

undef %hash;

答案 3 :(得分:2)

使用

%hash = ();

答案 4 :(得分:2)

你可以这样做:

%hash = ();

答案 5 :(得分:1)

%hash =();必须工作

答案 6 :(得分:0)

由于OP要求使用一个使用严格和警告的衬垫

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