2009年7月14日星期二

[PerlChina] Re: 请问如何初始化一个哈希的哈希为空?

On 7/14/09, yi wang <wangyi2412@gmail.com> wrote:
> 如题。
> 比如%hash=();初始化一个一般的hash表为空,以后可以有类似 $hash{'key1'} = value1; 的赋值
> 但是如果hash{'key1'}值又是一个hash表,即意为 %hash{'key1'} = %anotherhash,
> 应该如何初始化这样的hash的hash表为空?

好问题,在 perl 里操纵复杂数据结构时经常会需要这么做,我一般这么写:

my $anotherhash = ($hash{'key1'} ||= {});
$anotherhash->{dog} = 32; # 这里我们再对子哈希进行操作

对于子数组的情形亦是类似的:

my $sublist = ($hash{'key1'} ||= []);
push @$sublist, $my_value;

这里 A ||= B 的作用类似于 if (!A) { A = B },或许

if (!exists $hash{'key1'}) {
$hash{'key1'} = {};
}

这种写法的运行效率更高一些,但不如 ||= 来得紧凑,哈哈,看个人口味了 :) 在 Perl 5.10.x 和 Perl 6 中还可以写为
A //= B,即相当于 A = B if defined B. 虽说仍不及 exists,但 defined 约束可能会更高效一些 :)

由于你使用了 %hash{'key1'} = %anotherhash 这样的写法,我估计你不太熟悉 Perl 5
中的"引用",呵呵。操纵复杂数据结构需要知道引用的概念,以及 %hash{'key1'} 这种 Perl 6 的写法在我们平常使的 Perl
5 中是不 work 的,呵呵:

$ perl -e 'my %a=(dog=>32);print %a{dog}'
syntax error at -e line 1, near "%a{dog"
Execution of -e aborted due to compilation errors.

但 Perl 6 可以(这里以 Rakudo 为例):

$ ./perl6 -e 'my %a=(dog=>32);print %a{"dog"}'
32

哈哈!

Cheers,
-agentzh

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

没有评论: