use strict; use warnings; my @records; { local $/ = "\n\n"; open IN, "<", "infile.dat" or die "Bleah\n$!"; while ( my $record = ) { my %rechash; foreach my $kvpair ( split /\n/, $record ) { my ( $key, $val ) = split /\s*=\s*/, $kvpair; $rechash{$key} = $val; } push @records, { %rechash }; } close FH; } my @sortrecs = sort { $a->{'area'} <=> $b->{'area'} } @records; open OUT, ">", "outfile.dat" or die "Ick!\n$!"; foreach my $record ( @sortrecs ) { while ( my ( $key, $val ) = each %{$record} ) { print OUT "$key = $val\n"; } print "\n"; } close OUT or die "Argh!\n$!";