クイックハック。これにより、一連の値(2つの連続する改行で区切られます)が読み込まれ、ハッシュに入れられ、そのハッシュが配列にプッシュされます。入力レコード区切り文字を使用してレコード$/
を読み取ります。空の文字列に設定$/
することは、""
に設定することに似てい"\n\n"
ます。詳細については、上記のリンク先のドキュメントを参照してください。
ここで何が必要かよくわかりません。1行だけがマージされた場合は、配列にプッシュせずにハッシュを格納するだけです。最初のレコードを「記憶」します。
use strict;
use warnings;
$/ = ""; # paragraph mode
my @sets;
while (<DATA>) {
my %set;
chomp; # this actually removes "\n\n" -- the value of $/
for (split /\n/) { # split each record into lines
my ($set,$what,$value) = split ' ', $_, 3; # max 3 fields
$set{$what} //= $value; # //= means do not overwrite
}
$set{device} =~ s/^"|"$//g; # remove quotes
push @sets, \%set;
}
for my $set (@sets) { # each $set is a hash ref
my $string = join " ", "route",
@{$set}{"device","dst","gateway"}; # using hash slice
print "$string\n";
}
__DATA__
set device "internal"
set dst 13.13.13.13 255.255.255.255
set gateway 172.16.1.1
set device "internal"
set dst 14.14.14.14 255.255.255.255
set gateway 172.16.1.1
set device "internal"
set dst 15.15.15.15 255.255.255.255
set gateway 172.16.1.1
出力:
route internal 13.13.13.13 255.255.255.255 172.16.1.1
route internal 14.14.14.14 255.255.255.255 172.16.1.1
route internal 15.15.15.15 255.255.255.255 172.16.1.1