不使用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
相关产品推荐
相关产品推荐

