use List::Util qw( max ); my @raw = qw( 1.3 2.3 2.1 2.0 2.0.3 1.2 2.0.2 1.0 ); my $longest = max map { my @c = split(/\./, $_); scalar @c } @raw; my @sorted = map { $_->[1] } sort { $a->[0] cmp $b->[0] } map { my @c = split( /\./, +$_ ); push @c, ("0") x $longest - @c; [ pack( "c*", @c ), $_ ] } @raw; print join( "\n", @sorted ), "\n";