web-dev-qa-db-ja.com

Perlで数値を並べ替える方法は?

_print "@_\n";
4109 4121 6823 12967 12971 14003 20186
_

Perlで並べ替える方法を教えてください。

@sorted = sort(@_);を使用すると、アルファベット順になります

_13041 13045 14003 20186 4109 4121 6823
_

数値の順序を取得するにはどうすればよいですか? Perlには、マージソート、挿入ソートなどの組み込み関数がありますか?

24
Lazer

カスタム比較関数をPerlのソートルーチンに渡すことができます。ただ使用する:

@sorted = sort { $a <=> $b } @unsorted;

sort関数は、コードブロックの形式で、最初の引数としてカスタム比較関数を受け入れます。 {...}の部分はこのコードブロックです( http://perldoc.Perl.org/functions/sort.html を参照)。

sortは、ソートする配列の2つの要素を比較する必要があるときに、このカスタム比較関数を呼び出します。 sortは常に、比較する2つの値を$a$bとして渡し、比較関数は比較の結果を返す必要があります。この場合、数値比較に演算子を使用するだけです( http://perldoc.Perl.org/perlop.html#Equality-Operators を参照)。これは、おそらくこの目的のためだけに作成されたものです:-) 。

" Perl Cookbook "、Chapter 04 Subchapter 15から恥知らずに盗まれた解決策(本を購入する-価値がある!)

48
sleske

sort() に比較関数を指定します。

# sort numerically ascending
my @articles = sort {$a <=> $b} @files;

# sort numerically descending
my @articles = sort {$b <=> $a} @files;

デフォルトのソート関数はcmp、文字列比較で、(1, 2, 10)(1, 10, 2)にソートします。上記で使用されている<=>は、数値比較演算子です。

9
Eugene Yarmash

Perlのsortは、デフォルトでアルファベット順にASCIIの順序で並べ替えます。数値で並べ替えるには、次を使用できます。

@sorted = sort { $a <=> $b } @_;
8
codaddict

これはPerl FAQです。コマンドラインから:

perldoc -q sort

perlfaq4:(何か)で配列を並べ替える方法は?

6
toolic
@l = (4109, 4121, 6823, 12967, 12971, 14003, 20186, 1, 3, 4);
@l = sort { $a <=> $b } @l;
print "@l\n"; # 1 3 4 4109 4121 6823 12967 12971 14003 20186

独自のソートサブルーチンを提供する必要があります{ $a <=> $b }

5
adamse

配列の値を比較するために使用する関数を事前定義できます。 perldoc -f sortは例を示します:

# sort using explicit subroutine name
sub byage {
   $age{$a} <=> $age{$b};  # presuming numeric
}
@sortedclass = sort byage @class;

<=>演算子は、数値でソートするために使用されます。

@sorted = sort {$a <=> $b} @unsorted;
3

私はPerlの新人(私のような)のために、この質問、つまり数値配列をソートする方法について多くの時間を節約したいだけです。私は時間を無駄にしただけでなく、夢中になっているからです!

したがって、ここ(および他の多くの場所)では、数値配列をソートする方法は次のとおりです。

@sorted_array = sort { $a <=> $b } @unsorted_array;

試してみると、「並べ替えの比較で "my $ a"は使用できません」というエラーが表示されます。 (これは、「strict.pm」を使用して「$ a」をすでに宣言しているためです)。ただし、宣言されていない変数は未定義として拒否されるため、使用できません。だから、あなたは行き​​詰まったように感じるかもしれません。

この問題を「困難な方法」で解決しなければならなかったのは、「$ a」および「この使用のために$ b 'が予約されています(トークン)! (もちろん、これは「strict」を使用する場合に必要です。「a」と「b」はプログラミングで使用される最も一般的なshort変数の1つであり、論理的にはそうです!)

これが、このページにアクセスする多くのPerl初心者プログラマーの助けになることを願っています!

1
Apostolos