17

キーが数字で始まる、または数字であるPerlハッシュがあります。

使用する場合、

foreach my $key (sort keys %hash) {
    print $hash{$key} . "\n";
}

リストは次のように表示される可能性があります、

0
0001
1000
203
23

それ以外の

0
0001
23
203
1000
4

4 に答える 4

42
foreach my $key (sort { $a <=> $b} keys %hash) {
    print $hash{$key} . "\n";
}

ソート操作は、オプションの比較「サブルーチン」を取ります(ここで行ったように、コードのブロックとして、またはサブルーチンの名前として)。組み込みの数値比較演算子「<=>」を使用して、キーを数値として扱うインライン比較を提供しました。

于 2008-12-20T17:56:49.617 に答える
19

ポールの答えは数字については正しいですが、さらに一歩進んで、人間が行うように単語と数字の混在を並べ替えたい場合は、どちらcmp<=>行いません。例えば、

  9x
  14
  foo
  fooa
  foolio
  Foolio
  foo12
  foo12a
  Foo12a
  foo12z
  foo13a

Sort:: は自然にこの問題を処理し、nsortおよびncmpルーチンを提供します。

于 2008-12-22T03:14:02.003 に答える
2

あなたの最初の問題はループの本体です(ここで他の答えは指摘していないようです)。

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

于 2016-06-22T17:55:45.153 に答える
1
$key (sort { $a <=> $b} keys %hash) 

トリックを行います

または降順ソート:

$key (sort { $b <=> $a} keys %hash)

あるいは

$key (sort { $a <=> $b} values %hash)
$key (sort { $b <=> $a} values %hash)
于 2016-06-22T17:32:13.683 に答える