Another way would be to pass each line of data into a series of nested maps to split on whitespace then on the equals to produce an anonymous hash (hashref) which is passed to a third map. There the value of the "type" key is preserved, the "type" key/value pair deleteed from the hashref and finally the preserved key, with its value being the hashref, passed into %hash.
use strict;
use warnings;
use Data::Dumper;
open my $inFH, q{<}, \ <<EOF or die $!;
type=first a=1 b=2 c=3
type=second d=4 e=5 f=6
type=third g=7 h=8 i=9
EOF
my %hash =
map {
my $key = $_->{ type };
delete $_->{ type };
( $key => $_ );
}
map { { map { split m{=} } split } }
<$inFH>;
close$inFH or die $!;
print Data::Dumper
->new( [ \ %hash ], [ qw{ *hash } ] )
->Sortkeys( 1 )
->Dumpxs();
The output.
%hash = (
'first' => {
'a' => '1',
'b' => '2',
'c' => '3'
},
'second' => {
'd' => '4',
'e' => '5',
'f' => '6'
},
'third' => {
'g' => '7',
'h' => '8',
'i' => '9'
}
);
I hope this is helpful.
Update: Revised wording, s/a series of/nested/.