use strict; use warnings; my @lines = ( "0|aa aa|1998|aaa a|a aaa|10|aa a aa", "1|bbb aa|1992|fa a|gaa|5|gfsa aa", "2|aa ba|1997|afa|hhaa|1|asdf aa", "3|cccaa|1997|ssa s|hhava|3|gfdh gaa", "4|adaa|1994|g a a|jiua|6|angf a" ); my $field = 5; @lines = map { join '|', @$_ } sort { $b->[$field] <=> $a->[$field] } map { [ split /\|/ ] } @lines; print "$_\n" for @lines;