foreach (@files) { my $file = $_; my @newfiles = map { $_->[0] } sort { $a->[1] <=> $b->[1] } map { [ $_, /.+?-(\d+)\..+$/ ] } @files; print $_,$/ for @newfiles; outputs for example: abcd1_abc_123456.abc1a_A.201307282200-2300-9.gz abcd1_abc_123456.abc1a_A.201307282300-2400-9.gz abcd1_abc_123456.abc1a_A.201307272100-2200-10.gz abcd1_abc_123456.abc1a_A.201307281900-2000-10.gz I need it to output like this: abcd1_abc_123456.abc1a_A.201307282200-2300-1.gz abcd1_abc_123456.abc1a_A.201307282200-2300-2.gz abcd1_abc_123456.abc1a_A.201307282200-2300-3.gz abcd1_abc_123456.abc1a_A.201307282200-2300-4.gz ..etc.. abcd1_abc_123456.abc1a_A.201307282200-2300-10.gz abcd1_abc_123456.abc1a_A.201307282200-2300-11.gz abcd1_abc_123456.abc1a_A.201307282200-2300-12.gz abcd1_abc_123456.abc1a_A.201307282300-2400-1.gz abcd1_abc_123456.abc1a_A.201307282300-2400-2.gz abcd1_abc_123456.abc1a_A.201307282300-2400-3.gz abcd1_abc_123456.abc1a_A.201307282300-2400-4.gz abcd1_abc_123456.abc1a_A.201307282300-2400-5.gz ..etc.. abcd1_abc_123456.abc1a_A.201307282300-2400-10.gz abcd1_abc_123456.abc1a_A.201307282300-2400-11.gz abcd1_abc_123456.abc1a_A.201307282300-2400-12.gz