3

配列のハッシュがあり、配列サイズで並べ替えたいと思います。

これまでの私のコードは次のとおりです。

use strict;
use warnings;

my %hash_array = (
    "array_1" => ["apple", "ball", "cat"],
    "array_2" => ["def", "leppard", "rocks", "too"],
    "array_3" => ["italian", "pastry", "missing", "cherry", "top"],
);

# Length of array_1
my $array_1_size = @{$hash_array{"array_1"}};
print "Should print three: $array_1_size\n";

# Found this here: https://stackoverflow.com/questions/15722286
# But my result remains unsorted
foreach my $key ( sort { $hash_array{$b} <=> $hash_array{$a}} keys %hash_array ) {
    print "key: $key\n";
}

個々の配列のサイズを取得する方法は理解していますが、それを並べ替え関数と組み合わせる方法がわかりません。

ここから最後の foreach ブロックをコピーしましたが、出力が順序付けされていないため、その解決策は機能しません。コードの最後のブロックについていくつか質問がありました。

  1. 以前に参照された $b と $a が表示されません。これは、ソート機能が理解する組み込み参照ですか?
  2. 解決策は元のポスターではうまくいったようですが、私の場合はうまくいきません。しかし、当初の目標は似ています。配列サイズに基づいて順序付けされた出力を取得するために何が欠けていますか?
  3. 配列のハッシュを配列サイズで昇順および降順でソートする最良の方法は何ですか?
4

3 に答える 3

4

ソート機能はまさにそれです-匿名サブ。単一の比較に限定されるわけではなく、-1、0、または 1 を返すもので終了する必要があります。はい、$aおよび$bは比較される 2 つの値です。これらはスカラーまたは参照である可能性があります。

次のように問題を解決できます。

foreach my $key (sort { 
                        my $length_a = scalar @{$hash_array{$a}};
                        my $length_b = scalar @{$hash_array{$b}};
                        $length_b <=> $length_a
                      } keys %hash_array) {
    ...
}

これを 1 行にまとめることができることはわかっていますが、要点は、sortサブルーチン内で複数の比較を行う方法を示すことです。

于 2013-06-02T23:28:34.360 に答える