我想完全重置%hash
,以便它根本不包含键或值。我更喜欢使用单线而不是使用循环。
到目前为止,我已经尝试过:
%hash = 0;
%hash = undef;
但是这些都在严格模式下抛出错误并启用了警告,所以我写了一个简单的for循环来实现同样的事情:
for (keys %hash) {
delete $hash{$_};
}
这样可行,但我真的很想用单行做这件事。有没有办法简单地重置我忽略的哈希?
答案 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)