3

以下のコードを実行して文字列をソートしていますが、期待どおりの結果が得られません。

コード:

use warnings;
use strict;

my @strArray= ("64.0.71","68.0.71","62.0.1","62.0.2","62.0.11");
my @sortedStrArray = sort { $a cmp $b } @strArray;

foreach my $element (@sortedStrArray ) {
    print "\n$element";
}

結果:

62.0.1
62.0.11   <--- these two
62.0.2    <---
64.0.71
68.0.71

期待される結果:

62.0.1
62.0.2    <---
62.0.11   <---
64.0.71
68.0.71
4

4 に答える 4

9

「1」文字 0x31。「2」は文字 0x32 です。0x31 は 0x32 より小さいため、「1」は「2」の前にソートされます。あなたの期待は間違っています。

取得したい結果を得るには、次を使用できます。

my @sortedStrArray =
   map substr($_, 3),
   sort
   map pack('CCCa*', split(/\./), $_),
   @strArray;

または、はるかに広い範囲の入力の場合:

use Sort::Key::Natural qw( natsort );
my @sortedStrArray = natsort(@strArray);
于 2013-03-01T18:41:37.913 に答える
1

cmp は、数値ではなく、辞書編集的に (辞書のように) 比較しています。これは、不一致が発生するまで文字列を 1 文字ずつ処理することを意味します。「62.0.11」と「62.0.2」の場合、文字列は「62.0」まで同じです。そして、次の文字で不一致を見つけます。2 > 1 なので、「62.0.2」 > 「62.0.11」とソートされます。文字列を何に使用しているのか、または文字列のフォーマット方法を制御できるのかどうかはわかりませんが、フォーマットを「62.00.02」(すべてのセグメントに 2 桁あります) の代わりに「62.0」に変更する場合.2" であれば、期待どおりにソートされます。

于 2013-03-01T18:51:21.707 に答える
0

Perl モジュールSort::Versionsを試してみてください。期待どおりの結果が得られるように設計されています。

http://metacpan.org/pod/Sort::バージョン

英数字のバージョン ID もサポートしています。

于 2013-03-01T18:49:43.440 に答える
0

Schwartzian_transform

これは randal schwartz transofm の使用法です:

まず、何が必要かを理解してください。
最初の番号、次に 2 番目、3 番目の順に並べ替えます。

これでやってみましょう:

use warnings;
use strict;
use Data::Dumper;
my @strArray= ("64.0.71","68.0.71","62.0.1","62.0.2","62.0.11");
my @transformedArray = map{[$_,(split(/\./,$_))]}@strArray;

=pod
  here @transformedArray have such structure: 
  $each_element_of_array: [$element_from_original_array, $firstNumber, $secondNumber, $thirdNumber];
  for example:
  $transformedArray[0] ==== ["64.0.71", 64, 0, 71];
  after that we will sort it 
  first by first number
  then: by second number
  then: by third number
=cut

my @sortedArray =  map{$_->[0]} # save only your original string.
                  sort{$a->[3]<=>$b->[3]}
                  sort{$a->[2]<=>$b->[2]}
                  sort{$a->[1]<=>$b->[1]} 
                                         @transformedArray;
print Dumper(\@sortedArray);
于 2013-03-01T19:13:07.987 に答える