my @sortrecs = map { $_->[0] } sort { $a->[1] <=> $b->[1] } map { [ $_, ( split /=\s*/, (grep { /area/ } @{$_} ) )[1] ] } @records; #### 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$!";