sub sect { my @a = split /\./, $a; my @b = split /\./, $b; my $len = @b; if ( @a > @b ) { $len = @a; } foreach my $i ( 0 .. $len-1 ) { if ( $a[$i] > $b[$i] ) { return 1; } elsif ( $a[$i] < $b[$i]) { return -1; } } return 0; } my @s = ( "1.0", "3", "2.0.1", "4.1.1.1", "1.0.1", "1.1", "1.0.2", "2.0" ); my @t = sort sect @s; print "@t\n"; __DATA__ 1.0 1.0.1 1.0.2 1.1 2.0 2.0.1 3 4.1.1.1