use strict; use warnings; my @array1 = ; chomp @array1; sub outlinish_transform { return join("\n", map { $_->[0] } sort { _outlinish_st() } map { [ $_, [split /\./,$_] ] } @array1); } sub straight_outlinish { return join("\n", sort { _outlinish() } @array1); } sub _outlinish { my @one = split /\./, $a; my @two = split /\./, $b; my $max = @one > @two ? @one : @two; for my $i (0 .. $max-1) { if (my $res = ($one[$i] || 0) <=> ($two[$i] || 0)) { return $res; } } } sub _outlinish_st { my $max = @$a > @$b ? @$a : @$b; for my $i (0 .. $max-1) { if (my $res = ($a->[1][$i] || 0) <=> ($b->[1][$i] || 0)) { return $res; } } } __DATA__ 1 1.1 1.2 1.3 1.3.1 1.3.2 1.3.2.1 1.2.1 1.2.2.1 1.4