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

不使用Text::CSV模块,将CSV转为Perl哈希数组并按部门分组存唯一键

不使用Text::CSV构建按部门组织的唯一键关联数组

原代码的问题

  • split(/,/, $fh) 参数错误:while(<$fh>) 每次读取的行存储在默认变量 $_ 中,应该改为 split(/,/, $_)。
  • 逻辑不符合需求:原代码试图将 emp/dept/id 作为哈希的顶级键,但实际需要的是以部门名为键,下属存储对应员工和ID信息。

解决方案

根据你的需求(按部门组织,且存储唯一键),提供两种实现方式:

方式1:保留所有部门-员工记录(员工可跨部门重复)

适合需要保留同一员工在不同部门多条记录的场景:

my %hash;
while (my $line = <$fh>) {
    chomp $line;  # 移除行尾换行符,避免字段带换行
    my ($emp, $dept, $id) = split(/,/, $line);
    
    # 将员工和ID封装为哈希,添加到对应部门的数组中
    push @{$hash{$dept}}, {
        emp => $emp,
        id  => $id
    };
}

执行后哈希结构(对应示例CSV):

$hash = {
    dept1 => [
        { emp => 'emp1', id => '1090' },
        { emp => 'emp3', id => '3213' }
    ],
    dept2 => [
        { emp => 'emp2', id => '8920' },
        { emp => 'emp3', id => '3234' }
    ]
};

方式2:部门内员工唯一(自动去重)

如果需要同一部门下的员工仅保留一条记录(以员工名为唯一键),可以将部门下的结构改为哈希:

my %hash;
while (my $line = <$fh>) {
    chomp $line;
    my ($emp, $dept, $id) = split(/,/, $line);
    
    # 用员工名作为部门内的唯一键,重复员工会自动覆盖(可根据需求调整逻辑)
    $hash{$dept}{$emp} = $id;
}

执行后哈希结构:

$hash = {
    dept1 => {
        emp1 => '1090',
        emp3 => '3213'
    },
    dept2 => {
        emp2 => '8920',
        emp3 => '3234'
    }
};

补充说明

  • 如果CSV字段包含逗号(你的示例未涉及),简单split会失效,但你明确要求不使用Text::CSV,这类场景暂不考虑。
  • chomp 是必要操作,否则split后的最后一个字段会带有换行符,影响后续逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:42:50