zone.csv 如下所示:
====================================================== ==========
zone0,primaryserver1,primaryserver2,secondaryserver1|secondaryserver2
zone1,primaryserver1,primaryserver2,primaryserver3,secondaryserver1|secondaryserver2|secondaryserver3
zone2,primaryserver1,secondaryserver1
zone3,primaryserver1,primaryserver2,secondaryserver1|secondaryserver2
====================================================== ==========
首先是区域,然后列出所有主服务器,以逗号分隔,然后列出所有辅助服务器,以管道分隔。
我需要填写两个哈希值(区域+主服务器)和(区域+辅助服务器)。我需要有关使用带有两个分隔符的 split 函数的帮助。我希望所有主服务器都在一个散列中,所有辅助服务器都在另一个散列中(区域是两个散列的键)。非常感谢您的帮助。
my %zoneP;
my %zoneS;
my $file1 = "zone.csv";
open (IN1, "$file1") || die "Cannot open $file1\n";
# Read File
while (<IN1>)
{
chomp($_);
# all regex - avoid comments and empty lines
if ( ($_ !~ /^(#)+/) && ( $_ =~ /[a-z A-Z 1-9 \. \[ \] \* \+ ]/) )
{
print "$_\n" if($debug > -1);
my ($zone, $serverP, $serverS) = split(",",$_);
$zoneP{$zone} = $serverP;
$zoneS{$zone} = $serverS;
}
}
close IN1;
我编写了上面的代码,但需要 split 函数的帮助 - 如何使用两个分隔符并在单独的哈希中获取值。
您可以使用
split
两次,首先使用逗号,然后使用竖线。
use warnings;
use strict;
my %zoneP;
my %zoneS;
# Read File
while (<DATA>) {
chomp($_);
# all regex - avoid comments and empty lines
if ( ($_ !~ /^(#)+/) && ( $_ =~ /[a-z A-Z 1-9 \. \[ \] \* \+ ]/) )
{
my ($zone, @servers) = split(/,/, $_);
my $server_s = pop @servers;
my @servers_s = split(/\|/, $server_s);
push @{ $zoneP{$zone} }, [@servers];
push @{ $zoneS{$zone} }, [@servers_s];
}
}
print "zoneP\n";
use Data::Dumper; $Data::Dumper::Sortkeys=1; print Dumper(\%zoneP);
print "zoneS\n";
use Data::Dumper; $Data::Dumper::Sortkeys=1; print Dumper(\%zoneS);
__DATA__
zone0,primaryserver1,primaryserver2,secondaryserver1|secondaryserver2
zone1,primaryserver1,primaryserver2,primaryserver3,secondaryserver1|secondaryserver2|secondaryserver3
zone2,primaryserver1,secondaryserver1
zone3,primaryserver1,primaryserver2,secondaryserver1|secondaryserver2