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

如何用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";
}

代码逻辑说明

  1. 拆分整行:先用split /,/, $line把每行按逗号拆分成数组,直接区分出zone、主服务器段、从服务器段的雏形
  2. 分离zone:用shift @parts取出数组第一个元素作为zone名称
  3. 分离从服务器段:用pop @parts取出数组最后一个元素,这部分是包含竖线分隔的从服务器列表
  4. 填充主服务器哈希:数组剩余的元素就是所有主服务器,直接将数组引用存入%zoneP
  5. 拆分从服务器:用split /\|/, $secondary_str把从服务器段按竖线拆分成数组,将数组引用存入%zoneS

这种方法无需复杂正则,代码可读性高,能兼容所有给定的格式场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:20:24