#!/usr/bin/env perl use strict; use warnings; use autodie; use Data::Dumper; my @out; open my $in_fh, '<', 'pm_1054339_data.txt'; while (<$in_fh>) { chomp; my ($key, $value) = split /=/; for ($key) { /component/ && do { push @out, { $key => $value }; last }; /version/ && do { $out[-1]{$key} = $value; last }; /sourcefile/ && do { push @{$out[-1]{order}}, $value; last }; /sourcesum/ && do { $out[-1]{sources}{$out[-1]{order}[-1]} = $value }; } } close $in_fh; print Dumper \@out;