_print "@_\n";
4109 4121 6823 12967 12971 14003 20186
_
Perlで並べ替える方法を教えてください。
@sorted = sort(@_);
を使用すると、アルファベット順になります
_13041 13045 14003 20186 4109 4121 6823
_
数値の順序を取得するにはどうすればよいですか? Perlには、マージソート、挿入ソートなどの組み込み関数がありますか?
カスタム比較関数を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から恥知らずに盗まれた解決策(本を購入する-価値がある!)
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)
にソートします。上記で使用されている<=>
は、数値比較演算子です。
Perlのsort
は、デフォルトでアルファベット順にASCIIの順序で並べ替えます。数値で並べ替えるには、次を使用できます。
@sorted = sort { $a <=> $b } @_;
@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 }
配列の値を比較するために使用する関数を事前定義できます。 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;
私はPerlの新人(私のような)のために、この質問、つまり数値配列をソートする方法について多くの時間を節約したいだけです。私は時間を無駄にしただけでなく、夢中になっているからです!
したがって、ここ(および他の多くの場所)では、数値配列をソートする方法は次のとおりです。
@sorted_array = sort { $a <=> $b } @unsorted_array;
試してみると、「並べ替えの比較で "my $ a"は使用できません」というエラーが表示されます。 (これは、「strict.pm」を使用して「$ a」をすでに宣言しているためです)。ただし、宣言されていない変数は未定義として拒否されるため、使用できません。だから、あなたは行き詰まったように感じるかもしれません。
この問題を「困難な方法」で解決しなければならなかったのは、「$ a」および「この使用のために$ b 'が予約されています(トークン)! (もちろん、これは「strict」を使用する場合に必要です。「a」と「b」はプログラミングで使用される最も一般的なshort変数の1つであり、論理的にはそうです!)
これが、このページにアクセスする多くのPerl初心者プログラマーの助けになることを願っています!