my %data; { my $in = 0; my %rec; while () { if (/^\s*{/) { $in = 1; next; } if (/^\s*}/) { my $name = delete($rec{Name}); $data{$name} = { %rec }; undef %rec; $in = 0; next; } if ($in) { if (/^\s*(\S+)\s*=\s*"(.*)"/) { $rec{$1} = $2; } } } } require Data::Dumper; print(Data::Dumper::Dumper(\%data)); #### $VAR1 = { 'C:' => { 'Size' => '160031014912', 'FreeSpace' => '114151464960' }, 'D:' => { 'Size' => '203921108992', 'FreeSpace' => '5515554816' }, 'H:' => { 'Size' => '400086708224', 'FreeSpace' => '43128733696' } }; #### my %data; { my %rec; while () { if (/^\s*{/ .. /^\s*}/) { if (/^\s*{/) { next; } if (/^\s*}/) { my $name = delete($rec{Name}); $data{$name} = { %rec }; undef %rec; next; } if (/^\s*(\S+)\s*=\s*"(.*)"/) { $rec{$1} = $2; } } } } require Data::Dumper; print(Data::Dumper::Dumper(\%data));