14


3

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

私が使うなら、

私の$キー(ソートキー%ハッシュ)をforeach {print $ hash {$ key}}。 "\ n"; }

リストは、

0 0001 1000 203 23

の代わりに

0 0001 23 203 1000

4 Answer


38


私の$キーに到達({$ a <=> $ b}キー%ハッシュをソート){print $ hash {$ key}。 "\ n"; }

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


18


Paulの答えは数字には正解ですが、それをさらに一歩進めて人間のように単語と数字が混在してソートしたいのであれば、 cmp`も <⇒ `もそうではありません。 例えば…​

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

Sort::Naturallynsort`と ncmp`ルーチンを提供することでこの問題を解決します。


1


$ key({$ a <=> $ b}キーの%ハッシュの並べ替え)

トリックをします

または

$ key({$ b <=> $ a}キーの%ハッシュの並べ替え)

降順

あるいは

$ key(ソート{$ a <=> $ b}値%ハッシュ)$キー(ソート{$ b <=> $ a}値%ハッシュ)


1


あなたの最初の問題はループの本体です。

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

`%hash`のキーが何であるかはわかりませんが、ループの中で、それらがキーとして「$ key」としてあなたに渡されることを知っています。 その後、キーを使用してハッシュの内容にアクセスし、各エントリを印刷します。

ハッシュの値はソートされた順序では現れません、なぜならあなたはキーでソートするからです。

代わりに_values_をソートされた順序で出力したい場合は、次のループを検討してください。

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

それがあなたが望んだことです。

さらなる情報とより多くの例についてはhttp://perldoc.perl.org/functions/sort.html [`sort`関数のPerlマニュアル]を参照してください。