use warnings; use strict; print sort { my @a = ($a =~ /(\d*)_FFF(\d*)_(\d*)/); my @b = ($b =~ /(\d*)_FFF(\d*)_(\d*)/); my $i=0; for ($i=0; $i < $#a && $a[$i] == $b[$i]; $i++){} $a[$i] <=> $b[$i]; } ; __DATA__ 0011_FFF0_0010 00111_FFF00_00011 000_FFF0_0000 #### $ perl /tmp/tst.pl 000_FFF0_0000 0011_FFF0_0010 00111_FFF00_00011