Я не уверен, что вы имеете в виду под хэшем, поскольку описываемое вами содержимое представляет собой просто список анонимных массивов. Здесь нет ключей, поэтому вы можете создать только массив. Если вы можете объяснить, какая часть данных должна быть ключом, мы можем использовать хеш.
Прагма use warnings
предпочтительнее модификатора -w
shebang, так как она более гибкая и может быть отменена.
Оператор диапазона ..
может быть симпатичным, но вы не должны использовать его везде, где это возможно.
Установка входного разделителя на "!\n"
позволит вам читать сразу по всем связанным строкам, которые затем могут быть помещены в ваш массив.
код выглядит так
use strict;
use warnings;
use Data::Dumper;
my @Vlan;
$/ = "!\n";
while (<DATA>) {
chomp;
push @Vlan, [split /[\r\n]+/];
}
print Data::Dumper->Dump([\@Vlan], ['*Vlan']);
__DATA__
vlan 81
name Vlan 81 test1
!
vlan 82
name Vlan 82 test2
!
vlan 83
name Vlan 83 test3
!
выход
@Vlan = (
[
'vlan 81',
'name Vlan 81 test1'
],
[
'vlan 82',
'name Vlan 82 test2'
],
[
'vlan 83',
'name Vlan 83 test3'
]
);
EDIT
Если ключ хеша всегда является первой строкой набора записей, то эта программа создает хеш по вашему запросу
use strict;
use warnings;
use Data::Dumper;
my %Vlan;
$/ = "!\n";
while (<DATA>) {
chomp;
my ($k, $v) = split /[\r\n]+/;
$Vlan{$k} = $v;
}
print Data::Dumper->Dump([\%Vlan], ['*Vlan']);
__DATA__
vlan 81
name Vlan 81 test1
!
vlan 82
name Vlan 82 test2
!
vlan 83
name Vlan 83 test3
!
выход
%Vlan = (
'vlan 81' => 'name Vlan 81 test1',
'vlan 83' => 'name Vlan 83 test3',
'vlan 82' => 'name Vlan 82 test2'
);