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

Perl 如何在不使用for循环的情况下完全重置哈希?,perl,hash,Perl,Hash,我想完全重置我的%hash,使其不包含任何键或值。我宁愿使用一个衬垫,也不愿使用环 到目前为止,我已经尝试: %hash = 0; %hash = undef; 但这两种方法都在启用警告的严格模式下抛出错误,因此我编写了一个简单的for循环来实现相同的功能: for (keys %hash) { delete $hash{$_}; } 这是可行的,但我真的很想用一个班轮。有没有办法简单地重置我忽略的哈希值?使用 %hash = (); 怎么样 %hash = (); 你可以做:

我想完全重置我的
%hash
,使其不包含任何键或值。我宁愿使用一个衬垫,也不愿使用环

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

%hash = 0;
%hash = undef;
但这两种方法都在启用警告的严格模式下抛出错误,因此我编写了一个简单的for循环来实现相同的功能:

for (keys %hash) {
    delete $hash{$_};
}
这是可行的,但我真的很想用一个班轮。有没有办法简单地重置我忽略的哈希值?

使用

%hash = ();
怎么样

%hash = ();
你可以做:

%hash = ();
您可以使用:

两者都
%hash=()
未定义%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

PVHV
s中的
MAX
字段是重要的位。

%hash=();必须工作

,因为OP要求使用一个可与“使用严格”和“警告”一起工作的内衬

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

有了
my
,您实际上是在创建一个与现有散列无关的新散列,而不是清除旧散列。感谢您提供的额外见解。我希望我的散列在重新填充时不会包含相同的值,因此我将使用undef%散列;语法。这并不是关于散列中存储了什么值,而是关于其中有多少值。分配、释放并再次分配一些内存以在散列中存储值并不是最快的事情,因此perl假设散列最终会再次增长到其原始大小,即使它被
%h=()
清除,并保留在散列中存储尽可能多的元素所需的内存,除非明确要求不这样做。这不会与散列中的实际值占用的内存相混淆。现在我看到了区别。好的,我将不得不使用Devel::Peek来看看哪个对我的用例更有效。实际上,Devel::Peek并不是告诉你什么更有效的工具。这就是你的大脑的作用。如果您正在清除一个有65个成员的散列,并且只将65个成员放入其中,那么您最好重用内存。如果您正在清除一个包含9000多个条目的散列,并且只希望有三个条目,那么请确定。。。是时候澄清了。我很惊讶没有人已经提出了这个问题。AFAICR我从来没有需要重置散列,因为使用Perl可以有非常紧凑的作用域。相反,我让变量不在范围之内;如果在循环中,将在顶部附近创建一个新的词汇表
my
我认为这是一个XY问题,有改进算法的空间,也许可以提供更多的上下文?哈希是我在所有检查和平衡之后在程序开始时创建的一个全局值。使用不同的子例程修改它,直到我将最终版本分配到数组中。考虑到这个流,除非我遗漏了什么,否则我相信在将这个特定哈希分配给数组后,对我来说“重置”它要比用
my
语句重新创建它更容易。(我可能忽略了XY问题,因为我不知道如何重置散列)
delete $hash{$_} for (keys %hash)