我正在构建一个散列,其中与标量相关联的键不一定是唯一的。期望的行为是,如果键是唯一的,则值是标量。如果密钥不是唯一的,我希望该值是与密钥关联的标量的数组引用。由于哈希是迭代构建的,我不知道密钥是否是提前唯一的。现在,我正在做类似的事情:
if(!defined($hash{$key})){
$hash{$key} = $val;
}
elseif(ref($hash{$key}) ne 'ARRAY'){
my @a;
push(@a, $hash{$key});
push(@, $val);
$hash{$key} = \@a;
}
else{
push(@{$hash{$key}}, $val);
}
有更简单的方法吗?
答案 0 :(得分:5)
rjh 是对的。
我写了太多的代码,完全按照你描述的方式编写 - 哈希值是一个数组引用,除非它不是。大量和条件类型检查。然后有一天它打了我,“我为什么要写这些废话?只是到处使用阵列参考,虚拟”我对自己说。从那天起,当我在公园散步时,蓝鸟从树上飞下来向我唱歌。
push @{$hash{$key}}, $val;
这就是你要做的一切。如果密钥不存在,则数组将自动生成。
如果您不喜欢autoviv,并希望明确做到:
$hash{$key} = [] unless exists $hash{$key};
push @{$hash{$key}}, $val;
即使这种“冗长”的方法也要短得多。
答案 1 :(得分:1)
if(!defined($hash{$key})){
$hash{$key} = $val;
}
elsif (ref($hash{$key}) ne 'ARRAY') {
$hash{$key} = [ $hash{$key}, $val ];
}
else{
push(@{$hash{$key}}, $val);
}