我对哈希的哈希相当缺乏经验-所以我希望有人能帮助一个新手…我有以下多级散列:
$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 },
的东西。