如何用Perl拆分含多分隔符的CSV行并存入不同哈希?
处理CSV双分隔符并填充Perl哈希的解决方案
问题描述
现有zone.csv文件内容格式如下:
zone0,primaryserver1,primaryserver2,secondaryserver1|secondaryserver2
zone1,primaryserver1,primaryserver2,primaryserver3,secondaryserver1|secondaryserver2|secondaryserver3
zone2,primaryserver1,secondaryserver1
zone3,primaryserver1,primaryserver2,secondaryserver1|secondaryserver2
规则说明:
- 第一列是zone名称
- 从第二列到倒数第二列是主服务器,用逗号分隔
- 最后一列是从服务器列表,内部用竖线分隔(可能只有单个服务器)
需要将数据填充到两个Perl哈希:
%zoneP:以zone为键,值为主服务器列表的数组引用%zoneS:以zone为键,值为从服务器列表的数组引用
解决方案代码
利用Perl的split结合数组操作shift/pop,可以简洁处理双分隔符问题,代码如下:
use strict; use warnings; my (%zoneP, %zoneS); # 打开CSV文件 open my $fh, '<', 'zone.csv' or die "无法打开zone.csv文件: $!"; while (my $line = <$fh>) { chomp $line; next if $line =~ /^\s*$/; # 跳过空行 # 第一步:按逗号拆分整行 my @parts = split /,/, $line; # 取出zone名称 my $zone = shift @parts; # 取出最后一列的从服务器部分 my $secondary_str = pop @parts; # 填充主服务器哈希:剩余的@parts就是所有主服务器 $zoneP{$zone} = \@parts; # 按竖线拆分从服务器部分,填充从服务器哈希 my @secondaries = split /\|/, $secondary_str; $zoneS{$zone} = \@secondaries; } close $fh; # 可选:验证结果输出 print "=== 主服务器哈希%zoneP ===\n"; foreach my $zone (sort keys %zoneP) { print "$zone: " . join(', ', @{$zoneP{$zone}}) . "\n"; } print "\n=== 从服务器哈希%zoneS ===\n"; foreach my $zone (sort keys %zoneS) { print "$zone: " . join(', ', @{$zoneS{$zone}}) . "\n"; }
代码逻辑说明
- 拆分整行:先用
split /,/, $line把每行按逗号拆分成数组,直接区分出zone、主服务器段、从服务器段的雏形 - 分离zone:用
shift @parts取出数组第一个元素作为zone名称 - 分离从服务器段:用
pop @parts取出数组最后一个元素,这部分是包含竖线分隔的从服务器列表 - 填充主服务器哈希:数组剩余的元素就是所有主服务器,直接将数组引用存入
%zoneP - 拆分从服务器:用
split /\|/, $secondary_str把从服务器段按竖线拆分成数组,将数组引用存入%zoneS
这种方法无需复杂正则,代码可读性高,能兼容所有给定的格式场景。
内容的提问来源于stack exchange,提问作者shubhra garg
相关产品推荐
相关产品推荐

