You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl:基于Hash筛选创建哈希数组的技术需求

按年月分组哈希的实现方案

嘿,这个按year和month分组的需求很常见,我给你两种实用的实现思路,你可以根据后续的使用场景来选:

方案一:保留完整原键值对的分组

如果需要每个数组元素直接包含所有同年月的原哈希键值对,用这个写法:

# 原哈希
my %hash = (
    key_1 => { year => 2000, month => 02, },
    key_2 => { year => 2000, month => 02, },
    key_3 => { year => 2000, month => 03, },
    key_4 => { year => 2000, month => 05, },
    key_5 => { year => 2000, month => 01, }
);

# 1. 按「年-月」创建分组哈希
my %grouped;
foreach my $key (keys %hash) {
    # 生成唯一分组标识:用连字符拼接年月
    my $group_key = join('-', $hash{$key}{year}, $hash{$key}{month});
    # 将当前键值对加入对应分组的数组
    push @{$grouped{$group_key}}, { $key => $hash{$key} };
}

# 2. 把分组哈希的值转换成目标数组
my @result_array = values %grouped;

效果说明

最终@result_array的每个元素都是一个数组,里面是同年月的原哈希键值对。比如其中一个元素会是:

[
    { key_1 => { year => 2000, month => 02 } },
    { key_2 => { year => 2000, month => 02 } }
]

方案二:明确存储年月与对应键列表

如果希望每个数组元素的结构更清晰,直接包含year、month和对应的原键列表,这种写法更直观:

# 原哈希(同上)
my %hash = (
    key_1 => { year => 2000, month => 02, },
    key_2 => { year => 2000, month => 02, },
    key_3 => { year => 2000, month => 03, },
    key_4 => { year => 2000, month => 05, },
    key_5 => { year => 2000, month => 01, }
);

# 1. 创建带年月标识的分组哈希
my %grouped;
foreach my $key (keys %hash) {
    my $year = $hash{$key}{year};
    my $month = $hash{$key}{month};
    my $group_key = join('-', $year, $month);
    
    # 如果分组不存在,先初始化结构
    unless ($grouped{$group_key}) {
        $grouped{$group_key} = {
            year  => $year,
            month => $month,
            keys  => []
        };
    }
    
    # 将当前键加入分组的keys列表
    push @{$grouped{$group_key}{keys}}, $key;
}

# 2. 转换成目标数组
my @result_array = values %grouped;

效果说明

此时@result_array的每个元素是这样的哈希结构:

{
    year  => 2000,
    month => 02,
    keys  => ['key_1', 'key_2']
}

两种方案都能满足你的核心需求,选哪种就看后续怎么处理这个结果数组啦~

内容的提问来源于stack exchange,提问作者rnarcos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:29:17