在Perl中按值对哈希的哈希排序的问题



我对哈希的哈希相当缺乏经验-所以我希望有人能帮助一个新手…我有以下多级散列:

$OCRsimilar{$ifocus}{$theWord}{"form"} = $theWord;
$OCRsimilar{$ifocus}{$theWord}{"score"} = $OCRscore;
$OCRsimilar{$ifocus}{$theWord}{"distance"} = $distance;
$OCRsimilar{$ifocus}{$theWord}{"similarity"} = $similarity;
$OCRsimilar{$ifocus}{$theWord}{"length"} = $ilength;
$OCRsimilar{$ifocus}{$theWord}{"frequency"} = $OCRHashDict{$ikey}{$theWord};

之后,我需要根据分数值对每个二级元素($theWord)进行排序。我尝试了各种各样的方法,但到目前为止都失败了。问题似乎是,排序在哈希中引入了新的空元素,把事情搞砸了。我所做的(例如——我确信这远非理想):

my @flat = ();
foreach my $key1 (keys { $OCRsimilar{$ifocus} }) {
    push @flat, [$key1, $OCRsimilar{$ifocus}{$key1}{'score'}];
}
for my $entry (sort { $b->[1] <=> $a->[1] } @flat) {
    print STDERR "@$entry[0]t@$entry[1]n";
}

如果我用Data:: dump检查,散列包含例如:

  'uroadcast' => {
                 'HASH(0x7f9739202b08)' => {},
                 'broadcast' => {
                                'frequency' => '44',
                                'length' => 9,
                                'score' => '26.4893274374278',
                                'form' => 'broadcast',
                                'distance' => 1,
                                'similarity' => 1
                              }
               }

如果我不做排序,哈希也没问题。这是怎么呢提前感谢任何类型的指针…!

告诉sort排序。不需要其他技巧。

#!/usr/bin/perl
use warnings;
use strict;
my %OCRsimilar = (
                  focus => {
                            word => {
                                     form       => 'word',
                                     score      => .2,
                                     distance   => 1,
                                     similarity => 1,
                                     length     => 4,
                                     frequency  => 22,
                                    },
                            another => {
                                        form       => 'another',
                                        score      => .01,
                                        distance   => 1,
                                        similarity => 1,
                                        length     => 7,
                                        frequency  => 3,
                                       },
                           });
for my $word (sort { $OCRsimilar{focus}{$a}{score} <=> $OCRsimilar{focus}{$b}{score} }
                   keys %{ $OCRsimilar{focus} }
             ) {
    print "$word: $OCRsimilar{focus}{$word}{score}n";
}

指针:perlreft, perlreft, sort.

让我觉得可疑的是这个结构:

foreach my $key1 (keys { $OCRsimilar{$ifocus} }) {

尝试解引用哈希,因此它变成:

foreach my $key1 (keys %{ $OCRsimilar{$ifocus} }) {

否则,您似乎是在创建一个匿名哈希并获取它的密钥,相当于以下代码:

foreach my $key1 (keys { $OCRsimilar{$ifocus} => undef }) {

因此,我认为在循环内$key1等于$OCRsimilar{$ifocus}。然后,我认为Perl将在遇到$OCRsimilar{$ifocus}{$key1}时进行自动验证,将散列引用$OCRsimilar{$ifocus}添加为自己的新键。

如果你设置了use warnings;,程序应该提示Odd number of elements in anonymous hash

但是,我不明白为什么Perl不做进一步的自动激活并添加'score'作为键,在数据转储中显示类似'HASH(0x7f9739202b08)' => { 'score' => undef },的东西。

最新更新