キーが数字で始まる、または数字であるPerlハッシュがあります。
使用する場合、
foreach my $key (sort keys %hash) {
print $hash{$key} . "\n";
}
リストは次のように表示される可能性があります、
0
0001
1000
203
23
それ以外の
0
0001
23
203
1000
キーが数字で始まる、または数字であるPerlハッシュがあります。
使用する場合、
foreach my $key (sort keys %hash) {
print $hash{$key} . "\n";
}
リストは次のように表示される可能性があります、
0
0001
1000
203
23
それ以外の
0
0001
23
203
1000
foreach my $key (sort { $a <=> $b} keys %hash) {
print $hash{$key} . "\n";
}
ソート操作は、オプションの比較「サブルーチン」を取ります(ここで行ったように、コードのブロックとして、またはサブルーチンの名前として)。組み込みの数値比較演算子「<=>」を使用して、キーを数値として扱うインライン比較を提供しました。
ポールの答えは数字については正しいですが、さらに一歩進んで、人間が行うように単語と数字の混在を並べ替えたい場合は、どちらcmp
も<=>
行いません。例えば、
9x
14
foo
fooa
foolio
Foolio
foo12
foo12a
Foo12a
foo12z
foo13a
Sort:: は自然にこの問題を処理し、nsort
およびncmp
ルーチンを提供します。
あなたの最初の問題はループの本体です(ここで他の答えは指摘していないようです)。
foreach my $key ( sort keys %hash ) {
print $hash{$key} . "\n";
}
のキーが何であるかはわかりません%hash
。$key
ループ内で字句順にとして渡されることを知っているだけです。次に、キーを使用してハッシュの内容にアクセスし、各エントリを出力します。
キーでソートするため、ハッシュの値はソートされた順序で出力されません。
代わりに、ソートされた順序で値を出力したい場合は、次のループを検討してください。
foreach my $value ( sort values(%hash) ) {
printf( "%s\n", $value );
}
このループは、観察した順序で値を出力します。
0
0001
1000
203
23
代わりに数値で並べ替えるには、次を使用します
foreach my $value ( sort { $a <=> $b } values(%hash) ) {
printf( "%s\n", $value );
}
これにより、
0
0001
23
203
1000
それはあなたが望んでいたものです。
詳細およびその他の多くの例については、関数の Perl マニュアルを参照してください。sort
$key (sort { $a <=> $b} keys %hash)
トリックを行います
または降順ソート:
$key (sort { $b <=> $a} keys %hash)
あるいは
$key (sort { $a <=> $b} values %hash)
$key (sort { $b <=> $a} values %hash)