my @Data = ( "1|someproject|active...", "2|somethingelse|finished..." ); #### #!/usr/bin/perl -wT use strict; # position to sort by my $sortbyfield = 3; my @input = ( '1|2|1|4|5|6|7|8|9', '1|2|2|5|5|6|7|8|9', '1|2|0|1|5|6|7|8|9', '1|2|9|2|5|6|7|8|9', '1|2|8|3|5|6|7|8|9', '1|2|7|4|5|6|7|8|9', '1|2|6|7|5|6|7|8|9', ); # Schwartzian Transform my @output = map { $_->[0] } sort { $a->[1] <=> $b->[1] } map { [$_, getfieldvalue($_, $sortbyfield)] } @input; print join( "\n", @output), "\n"; sub getfieldvalue { my ($line, $fieldno) = @_; my @items = split /\|/, $line; return $items[$fieldno]; } __END__ returns (sorted by 3rd _position, arrays start at 0) 1|2|0|1|5|6|7|8|9 1|2|9|2|5|6|7|8|9 1|2|8|3|5|6|7|8|9 1|2|1|4|5|6|7|8|9 1|2|7|4|5|6|7|8|9 1|2|2|5|5|6|7|8|9 1|2|6|7|5|6|7|8|9 #### my @fields = qw/id projname status submitdt assign_dt total complete_dt person dept closed_dt/; # Create my array of hashes. foreach (@Data) { my %hash; @hash{@fields} = split /\|/, $_; $_ = \%hash; } #### print "The id of the project in Data[0] is $Data[0]{id}\n"; #### my @sorted = sort {$a->{projname} cmp $b->{projname}} @Data; # To get the same kind of format as before ... foreach (@sorted) { my %temp = %$_; print "@temp{@fields}\n"; }