尝试根据其值对嵌套哈希进行排序,长话短说,我稍后解析%senseHash
某些值并将其存储在%rankedTest
哈希中,我想循环排序%rankedTest
和输出以归档我的代码:
foreach my $str (keys %senseHash)
{
my $selectedSense;
if (exists $senseHash{$str}{'phone'} && exists $senseHash{$str}{'product'})
{
if ($senseHash{$str}{'phone'} > $senseHash{$str}{'product'})
{
$selectedSense='phone';
}else
{
$selectedSense='product';
}
my $pPhone = $senseHash{$str}{'phone'} / $senses{'phone'};
my $pProduct = $senseHash{$str}{'product'} / $senses{'product'};
my $rankScore = abs(log($pPhone/$pProduct));
$rankedTest{$str}{$selectedSense}=$rankScore;
}
}
open($f1, '>', $inputs[1]);
foreach my $e (keys %rankedTest)
{
foreach my $s (sort { $rankedTest{$e}{$b} <=> $rankedTest{$e}{$a} } keys %{$rankedTest{$e}})
{
print $f2 "feature:$e -> sense:$s -> score:$rankedTest{$e}{$s} \n";
}
}
但输出如下:
feature:operations -> sense:product -> score:0.0859904478555225
feature:move -> sense:product -> score:0.309133999169732
feature:dispute -> sense:phone -> score:0.0963311089384321
而我真正想要的是:
feature:move -> sense:product -> score:0.309133999169732
feature:dispute -> sense:phone -> score:0.0963311089384321
feature:operations -> sense:product -> score:0.0859904478555225
任何线索我做错了什么或我如何能做到这一点。任何建议都会有所帮助。
编辑:内部散列有一个键,可以是电话或产品,我想根据此键值进行排序,而不管键是否phone
或product
要按底层的值对多级散列进行排序,我们必须比较所有条目。
此代码使用 (double) map构建要为所有级别打印的字符串,然后对其进行排序
use warnings;
use strict;
use feature 'say';
# Example hash
my %h = (
oper => { prod => 0.8, phone => 0.03 },
disp => { prod => 0.2, phone => 0.05 },
move => { prod => 0.6, phone => 0.01 }
);
my @res =
sort { (split ":", $b)[-1] <=> (split ":", $a)[-1] }
map {
my $k = $_;
map { "feature:$k -> sense:$_ -> score:$h{$k}{$_}" }
keys %{$h{$k}}
}
keys %h;
say for @res;
输出
feature:oper -> sense:prod -> score:0.8 feature:move -> sense:prod -> score:0.6 feature:disp -> sense:prod -> score:0.2 feature:disp -> sense:phone -> score :0.05 feature:oper -> sense:phone -> score:0.03 feature:move -> sense:phone -> score:0.01
我将phone
值设置为小于prod
' 以模拟发布的数据(与处理无关)。
示例哈希在问题中%h
代表%rankedTest
。它可能有一个或两个(或没有)prod
和phone
在子哈希中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句