use 5.012; use warnings; my %records; do { my $name; my $record; while (my $line = ) { chomp $line; if (defined $name) { if (length $line > 0) { # Data line my ($k, $v) = split /\s*=\s*/, $line, 2; $record->{$k} = $v; } else { # Reached end of record $records{$name} = $record; $name = undef; $record = undef; } } else { if (length $line > 0) { # Beginning of record $name = $line; $record = {}; } else { # Additional empty line between records } } } if (defined $name) { $records{$name} = $record; } }; use Data::Dumper; print Dumper \%records; __DATA__ h cool = ja schön = nein d cool = nein schön = ja b cool = nein schön = nein