$ perl -Mstrict -Mwarnings -E ' my @input = qw{ xxxxxx.2013-2.yyyyy xxxxxx.2012-51.yyyyy xxxxxx.2013-10.yyyyy xxxxxx.2012-50.yyyyy xxxxxx.2013-1.yyyyy }; say $_->[0] for sort { $a->[1] <=> $b->[1] or $a->[2] <=> $b->[2] } map { [ $_, split /-/, (split /\./)[1] ] } @input; ' xxxxxx.2012-50.yyyyy xxxxxx.2012-51.yyyyy xxxxxx.2013-1.yyyyy xxxxxx.2013-2.yyyyy xxxxxx.2013-10.yyyyy