perl – 更清洁的方式来存储用数组ref替换标量哈希值?

我正在构建一个散列,其中与标量相关联的键不一定是唯一的.期望的行为是,如果键是唯一的,则值是标量.如果密钥不是唯一的,我希望该值是与密钥关联的标量的数组引用.由于哈希是迭代构建的,我不知道密钥是否是提前唯一的.现在,我正在做这样的事情:

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);
}

有更简单的方法吗?

解决方法

rjh是对的钱.

我写了太多的代码,完全按照你的描述编写 – 哈希值是一个数组引用,除非它不是.大量和条件类型检查.然后有一天它打了我,“我为什么要写这些废话?只是到处使用阵列参考,虚拟”我对自己说.从那天起,当我在公园散步时,蓝鸟从树上飞下来向我唱歌.

push @{$hash{$key}},$val;

这就是你要做的一切.如果密钥不存在,则数组将自动生成.

如果你不喜欢autoviv,并希望明确做到:

$hash{$key} = [] unless exists $hash{$key};
push @{$hash{$key}},$val;

即使这种“冗长”的方法也要短得多.

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...