静的ハッシュの配列のキーに対応する値の数の多さ順で表示させたい
ハッシュのキーに対応する値の数の多さ順で表示させたいと考え、下記の所まで試行錯誤しておりますが、どうにも思ったようにソートできずにおります。
#!/usr/bin/perl
use strict;
my(%a, $i, $j ,$allarray ,@keys ,@keys2 ,%hash ,%files ,$a_mumei_ref ,$key ,$value ,@value ,$x ,$files);
# ハッシュの配列を静的に作る
%a = ( '0' => [ qw(0) ],
'1' => [ qw(1 1) ],
'3' => [ qw(3 3 3) ],
'7' => [ qw(7 7 7) ],
'2' => [ qw(2) ],
'4' => [ qw() ],
'5' => [ qw() ],
'6' => [ qw() ],
'8' => [ qw(8 8) ],
'9' => [ qw(9) ], );
@keys = sort { $hash{$b} <=> $hash{$a} || length($b) <=> length($a) || $a cmp $b } keys %a;
#ハッシュのキーを数字順で表示
foreach (@keys){
print $_ ."\n";
}
# 静的に作ったハッシュの配列を取り出してみる
foreach $i (sort keys %a) {
for ($j = 0; $j <= scalar(@{$a{$i}})-1; $j++) {
print '$a{'. $i. '}['. $j. ']='. $a{$i}[$j]. ' ';
}
$allarray=scalar(@{$a{$i}})-1;
print "No$i:kosuu:$allarray";
print "\n";
#配列の値の個数を調べその配列を作成
my($a_mumei) = $allarray;
$a_mumei_ref = \$a_mumei;
$files{"$i"}=($i,$a_mumei_ref);
}
#each関数で%filesの中身を表示
while ( ( $key , $value ) = each %files ){
print "key:$key value:$$value\n" ;
}
#試行錯誤
foreach $x (sort { $files{$b} <=> $files{$a} } keys %files){
print "$x => $files->{$x}\n";
}
@keys2 = sort {$hash{$a} <=> $hash{$b}} keys %files;
#@keys2 = sort { $hash{$b} <=> $hash{$a} || length($b) <=> length($a) || $a cmp $b } keys %files;
#@keys2 = sort { $hash{$a} cmp $hash{$b} } keys %files;
print "@keys2\n";
print "\n";
__END__;
私のイメージしておりますのは、ソートした結果がハッシュのキーに対応する値の数の多さ順で下記のように表示させたいのですが、
どのようにすれば可能でございますか、ご教授願えませんでしょうか
key:3 value:2・・・この場合valueは配列の個数
key:7 value:2
key:8 value:1
key:1 value:1
key:9 value:0
key:2 value:0
key:0 value:0
key:6 value:-1
key:4 value:-1
key:5 value:-1
お礼
ありがとうございます。 実はこのために何時間も、あれこれ悩んでしまったのですが、おかげ様で、いともたやすく、あっけなく解決してしまいました…(苦笑)。 なぜこんな基本的なことを、もっと多くのマニュアルなどに書いておかないんでしょうかね。 と思ったら、Exporter.pmのDOCには載っていました…、完全に見落としていました、お恥ずかしい限り。 それにしても、やはり一般的な書籍や解説ページには、あまり載っていませんね。探し方が悪いのでしょうか。 それでは、ありがとうございました。