Быстрый взлом. Это будет считывать набор значений (разделенных двумя последовательными символами новой строки), помещать его в хеш, а затем помещать этот хеш в массив. Использование входного разделителя записей $/
для чтения записей. Установка $/
в ""
пустая строка похожа на установку "\n\n"
, подробнее читайте в документации, приведенной выше.
Не совсем уверен, что вам нужно здесь. Если объединена только одна строка, просто сохраните хеш, не помещая его в массив. Он «запомнит» первую запись.
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