如何清除Perl哈希

Hai*_*ang 37 perl

假设我们定义了一个匿名哈希,如下所示:

my $hash = {};
Run Code Online (Sandbox Code Playgroud)

然后使用哈希.然后是时候清空或清除哈希以便重用.经过一些谷歌搜索,我发现:

%{$hash} = () 
Run Code Online (Sandbox Code Playgroud)

和:

undef %{$hash}
Run Code Online (Sandbox Code Playgroud)

两者都将满足我的需求.这两者有什么区别?它们是否都是用于清空哈希的相同方法?

Axe*_*man 32

%$hash_ref = ();比取消散列更有意义.取消定义哈希表示你已完成哈希.分配一个空列表表示你只想要一个空哈希.


Eth*_*her 24

是的,它们完全相同.两者都从表中删除任何现有的键和值,并将哈希值设置为空列表.

perldoc -f undef:

undef EXPR
undef取消定义EXPR 的值,该值必须是左值.仅用于标量值,数组(使用"@"),散列(使用"%"),子程序(使用"&")或typeglob(使用"*")...
示例:

               undef $foo;  
               undef $bar{'blurfl'};      # Compare to: delete $bar{'blurfl'};  
               undef @ary;  
               undef %hash;
Run Code Online (Sandbox Code Playgroud)

但是,undef除了标量之外,不应该使用除去任何值的值.对于其他变量类型,将其设置为该类型的"空"版本 - 例如对于数组或散列,@foo = (); %bar = ();

  • 它们几乎相同.在undef之后,定义将返回false,在=()之后,define仍然为true. (22认同)
  • 不推荐使用已定义的(%hash),不应使用它.所以rurban的反对可能最终没有实际意义.来自"已定义"的perl文档:"弃用了聚合(散列和数组)上定义的使用.它用于报告是否曾分配过该聚合的内存.在Perl的未来版本中,此行为可能会消失." (4认同)