比方说,我们定义了一个匿名的哈希是这样的:如何清除一个Perl哈希
my $hash = {};
然后以后使用哈希值。然后是清空或清除散列以重用 的时间。经过一番搜索谷歌,我发现:
%{$hash} =()
和:
undef %{$hash}
都将成为我的需求。两者有什么区别?他们都是同样的方法来清空哈希?
比方说,我们定义了一个匿名的哈希是这样的:如何清除一个Perl哈希
my $hash = {};
然后以后使用哈希值。然后是清空或清除散列以重用 的时间。经过一番搜索谷歌,我发现:
%{$hash} =()
和:
undef %{$hash}
都将成为我的需求。两者有什么区别?他们都是同样的方法来清空哈希?
是的,它们是完全相同的。都从表中删除所有现有的键和值,并将散列设置为空列表。
是undef EXPR
是undef 取消定义EXPR的值,它必须是一个左值。对标量值,数组(使用“@”),散列(使用“%”), 子例程(使用“&”)或typeglob(使用“*”)仅使用 ...
例子:
undef $foo;
undef $bar{'blurfl'}; # Compare to: delete $bar{'blurfl'};
undef @ary;
undef %hash;
但是,你不应该使用undef
删除的任何东西的价值,除了标量。对于其他变量类型,将其设置为该类型的“空白”版本 - 例如对于阵列或散列,@foo =(); %bar =();
%$hash_ref =();
比找不到散列更有意义。取消散列表示你已经完成散列。分配一个空列表说你只需要一个空的散列。
它们几乎完全相同。 undef后,定义将返回false,在=()后,定义仍然为真。 – rurban 2012-08-02 01:20:23
我认为rurban对这个答案的反对是相当重要的。也许以太可以更新他的答案来提及这种差异? – antred 2014-06-02 12:43:00
已定义(%散列)的使用已过时,不应使用。所以rurban的反对意见最终可能是没有意义的。从“定义”的perl文档中: “不建议使用定义在聚合(哈希和数组)上,它用于报告是否曾经分配过该聚合的内存,这种行为在未来的Perl版本中可能会消失。 – PhilHarvey 2015-11-23 14:27:18