#!/usr/bin/env perl use strict; use warnings; my $parsed = parse(\*DATA); use Data::Dump; dd $parsed; sub parse { my ($fh) = @_; my ($parsed, $car_key, $model_key); my $last_record_only_has_key = 0; my $new_model_array = 1; while (<$fh>) { my ($leader, $info) = /^([A-Z]*)[|]?(\S*)\s*$/; if ($leader) { if (! $info) { $car_key = $model_key if $last_record_only_has_key; $car_key = $leader unless $car_key; $last_record_only_has_key = 1; } $model_key = $leader; $new_model_array = 1; next unless $info; } $last_record_only_has_key = 0; for (split /[|]/ =>$info) { my ($key, $value) = split /=/; if ($new_model_array) { push @{$parsed->{$car_key}}, {$model_key => { $key => $value }}; $new_model_array = 0; } else { $parsed->{$car_key}[-1]{$model_key}{$key} = $value; } } } return $parsed; } __DATA__ CAR MODEL|name=Mustang|Quality=A|Speed= MODEL|Chevy=Cavalier|MPG=20 MODEL |Color=blue|type=hatchback|crashrating=spectacular |explodes=true|speed=|storage=none,little