2010-08-01 76 views
35

比方说,我们定义了一个匿名的哈希是这样的:如何清除一个Perl哈希

my $hash = {}; 

然后以后使用哈希值。然后是清空或清除散列以重用 的时间。经过一番搜索谷歌,我发现:

%{$hash} =() 

和:

undef %{$hash} 

都将成为我的需求。两者有什么区别?他们都是同样的方法来清空哈希?

回答

23

是的,它们是完全相同的。都从表中删除所有现有的键和值,并将散列设置为空列表。

参见perldoc -f undef

是undef EXPR
是undef    取消定义EXPR的值,它必须是一个左值。对标量值,数组(使用“@”),散列(使用“%”), 子例程(使用“&”)或typeglob(使用“*”)仅使用 ...
例子:

   undef $foo; 
       undef $bar{'blurfl'};  # Compare to: delete $bar{'blurfl'}; 
       undef @ary; 
       undef %hash; 

但是,你不应该使用undef删除的任何东西的价值,除了标量。对于其他变量类型,将其设置为该类型的“空白”版本 - 例如对于阵列或散列,@foo =(); %bar =();

+21

它们几乎完全相同。 undef后,定义将返回false,在=()后,定义仍然为真。 – rurban 2012-08-02 01:20:23

+0

我认为rurban对这个答案的反对是相当重要的。也许以太可以更新他的答案来提及这种差异? – antred 2014-06-02 12:43:00

+3

已定义(%散列)的使用已过时,不应使用。所以rurban的反对意见最终可能是没有意义的。从“定义”的perl文档中: “不建议使用定义在聚合(哈希和数组)上,它用于报告是否曾经分配过该聚合的内存,这种行为在未来的Perl版本中可能会消失。 – PhilHarvey 2015-11-23 14:27:18

29

%$hash_ref =();比找不到散列更有意义。取消散列表示你已经完成散列。分配一个空列表说你只需要一个空的散列。