文件
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
输出:
zoneP
$VAR1 = {
'zone0' => [
[
'primaryserver1',
'primaryserver2'
]
],
'zone1' => [
[
'primaryserver1',
'primaryserver2',
'primaryserver3'
]
],
'zone2' => [
[
'primaryserver1'
]
],
'zone3' => [
[
'primaryserver1',
'primaryserver2'
]
]
};
zoneS
$VAR1 = {
'zone0' => [
[
'secondaryserver1',
'secondaryserver2'
]
],
'zone1' => [
[
'secondaryserver1',
'secondaryserver2',
'secondaryserver3'
]
],
'zone2' => [
[
'secondaryserver1'
]
],
'zone3' => [
[
'secondaryserver1',
'secondaryserver2'
]
]
};
没有理由拆分两次,只需使用正则表达式
or
匹配进行拆分:
my ($zone, @servers) = split(/,|\|/, $_);
say $zone;
say Dumper(@servers);
zone1
$VAR2 = 'primaryserver1';
$VAR3 = 'primaryserver2';
$VAR4 = 'primaryserver3';
$VAR5 = 'secondaryserver1';
$VAR6 = 'secondaryserver2';
$VAR7 = 'secondaryserver3';