#! /usr/bin/perl use strict; use warnings; use 5.010; use Data::Dumper; my %data; sub process_dataset { my ( $dataset ) = @_; my $name; my %attr; # split dataset into lines for my $line ( split m{\n}, $dataset ) { if ( my ( $k, $v ) = $line =~ m/^(.+?)\s*=\s*(.+?)$/ ) { $attr{$k} = $v; } # no assignment found; must be a name else { $name = $line; } } return $name, \%attr; } # read by dataset, localize $/ in block { local $/ = "\n\n"; while ( my $dataset = ) { # remove $/ from dataset chomp $dataset; my ( $name, $attr ) = process_dataset( $dataset ); $data{$name} = $attr if $name; } } say Dumper \%data; __DATA__ h cool = ja schön = nein d cool = nein schön = ja b cool = nein schön = nein