6

たとえば、数値の形式は次のとおりです。

1.1.10
1.1.10.1
1.1.10.2
1.1.11
1.1.12
1.1.13
1.1.13.1
1.1.3
1.1.4

そして、私が出力を探しているワットは次のとおりです。

1.1.3
1.1.4
1.1.10
1.1.10.1
1.1.10.2
1.1.11
1.1.12
1.1.13
1.1.13.1
4

3 に答える 3

11
use Sort::Key::Natural qw( natsort );
my @sorted = natsort @data;

または (モジュールなし)

my @sorted =
   map $_->[0],
   sort { $a->[1] cmp $b->[1] }
   map [ $_, pack('C*', split /\./) ],
   @data;

または(モジュールなし、高速ですが、入力にはリストではなく配列が必要です)

 my @sorted =
   map $data[unpack('N', $_)],
   sort
   map pack('NC*', $_, split /\./, $data[$_]),
   0..$#data;

テンプレートでは、またはにpack変更できます。最大 255 の数値を許可します。最大 65,535 の数値を許可します。40 億までの数値を許可します。CnNCnN

于 2012-07-20T19:04:12.393 に答える
4

次のことを試してください。

use Modern::Perl;
use Sort::Naturally  qw{nsort};

my @numbers = nsort(qw{1.1.10 1.1.10.1 1.1.10.2 1.1.11 1.1.12 1.1.13 1.1.13.1 1.1.3});
say for @numbers;

出力:

1.1.3
1.1.10
1.1.10.1
1.1.10.2
1.1.11
1.1.12
1.1.13
1.1.13.1

お役に立てれば!

于 2012-07-20T19:07:05.017 に答える
0

これはあなたにとって理解しやすいかもしれません:

sub min { $_[0] <= $_[1] ? $_[0] : $_[1] }
sub comp 
  {
  ($a1,$a2) = @_;
  @a1 = @{$a1};
  @a2 = @{$a2};
  for (0..min(scalar @a1,scalar @a2)) 
     {
     return 1 if $a1[$_] > $a2[$_];
     return -1 if $a2[$_] > $a1[$_];  #exit early if an inequality is found
     }
  return 0 if @a1 == @a2; #both array are equal, thus both numbers are equal
  return @a1 > @a2 ? 1 : -1; #arrays are equal upto a certain point, thus longer array is 'greater'
  }
@sourcearray = ('1.1.10','1.1.10.1','1.1.10.2','1.1.11','1.1.12','1.1.13','1.1.13.1','1.1.3','1.1.4');
@individual = map { [split /\./] } @sourcearray; #splits each number into arrays consisting of individual numbers
@sorted = sort {comp($a,$b)} @individual; #sort algo decides which of these two arrays are 'greater'
{
local $" = ".";
print "@{$sorted[$_]}\n" for 0..$#sorted;
}
于 2012-07-20T20:53:50.397 に答える