open my $fd, '<', 'foo' or die open "$!\n"; my ($h, @arr); ## assuming and are always at the end of their lines while (<$fd>) { $h .= $_; ## We store header in $h. I won't parse it. last if /$/; } my $c = 0; while (<$fd>) { next if /^\n$/; my @fields = split / /, $_; foreach (@fields) { my ($k, $v) = $_ =~ /^(<[^>]+>)(.*)$/; next if $k eq ''; $arr[$c]{$k} = $v; } $c++ if /$/; } close $fd; #### $VAR1 = [ { '' => '213400', '' => 'Y', '' => 'NA', '' => '0001', '' => 'Y', '' => '59', '' => 'E', '' => '14', '' => '20M', '' => '59', '' => '4', '' => '1', '' => '4', '' => 'VHF', '' => 'VC3', '' => '4', '' => 'VC3O', '' => '20051029', '' => 'Y', '' => '4', '' => 'SSB', '' => '' }, { '' => '183206', '' => 'AB', '' => 'NA', '' => 'RAC', '' => '1257', '' => 'Y', '' => '14.16299', '' => '59', '' => '2006-07-01', '' => '20M', '' => '59', '' => '4', '' => '1', '' => 'MWB', '' => '27', '' => 'VE6', '' => 'N7DQ', '' => '2', '' => 'AB', '' => '20060701', '' => 'Y', '' => '2006-07-01', '' => '', '' => 'SSB', '' => 'VE6GG' } ];