-2
@aoaoh;

$aoaoh[0][0]{21} = 31;
$aoaoh[0][0]{22} = 31;
$aoaoh[0][0]{23} = 17;

for $k (0 .. $#aoaoh) {
    for $i(0.. $#aoaoh) {
        for $val (keys %{$aoaoh[$i][$k]}) {
            print "$val=$aoaoh[$i][$k]{$val}\n";
        }
    }
}

输出是:

    22=31
    21=31
    23=17

但我希望它是

    21=31
    22=31
    23=17

请告诉我这是哪里错了。

另外我如何对值进行排序,以便我得到输出为

    23=17
    22=31
    21=31(如果 2 个键的值相同,则值较高的键先出现)
4

4 回答 4

1

听起来像你想要的:

for $val (sort keys %{$aoaoh[$i][$k]}) {

和:

for $val (reverse sort keys %{$aoaoh[$i][$k]}) {

尽管从您的评论看来您不想要纯粹的反向排序。您想创建自己的排序功能:

for $val (sort {$aoaoh[$i][$k]->{$a} <=> $aoaoh[$i][$k]->{$b} || $a <=> $b} keys %{$aoaoh[$i][$k]}) {
于 2010-03-24T18:19:32.690 回答
0

听起来您希望哈希按照定义的顺序返回它们的键和值,而 perl 中没有这样的保证。

您可以实现一个更复杂的数据结构来为您处理一些排序,或者在您的显示中放置更多排序逻辑(而不仅仅是循环),或者加载一个模块以支持有序哈希,例如Tie::Hash ::索引

我希望 Tie::Hash::Indexed 实现看起来像这样:

my @aoaoh;

use Tie::Hash::Indexed;
tie my %hash, 'Tie::Hash::Indexed';
$aoaoh[0][0] = \%hash;

$aoaoh[0][0]{21} = 31;
$aoaoh[0][0]{22} = 31;
$aoaoh[0][0]{23} = 17;

for $k (0 .. $#aoaoh) {
    for $i(0.. $#aoaoh) {
        for $val (keys %{$aoaoh[$i][$k]}) {
            print "$val=$aoaoh[$i][$k]{$val}\n";
        }
    }
}
于 2010-03-24T19:02:03.797 回答
0

我回答了这个用户的另外两个完全相同的问题,但看起来这个会赢,所以我也在这里回答。

perlfaq4How do I sort an array by anything的回答?


为 sort() 提供一个比较函数(在 perlfunc 中的 sort 中描述):

@list = sort { $a <=> $b } @list;

默认排序函数是 cmp,字符串比较,它将 (1, 2, 10) 排序为 (1, 10, 2)。上面使用的 <=> 是数值比较运算符。

如果你有一个复杂的函数需要拉出你想要排序的部分,那么不要在排序函数中执行它。先把它拉出来,因为同一个元素可以多次调用sort BLOCK。这是一个示例,说明如何在每个项目的第一个数字之后提取第一个单词,然后不区分大小写地对这些单词进行排序。

@idx = ();
for (@data) {
    ($item) = /\d+\s*(\S+)/;
    push @idx, uc($item);
    }
@sorted = @data[ sort { $idx[$a] cmp $idx[$b] } 0 .. $#idx ];

也可以这样写,使用一种被称为 Schwartzian 变换的技巧:

@sorted = map  { $_->[0] }
    sort { $a->[1] cmp $b->[1] }
    map  { [ $_, uc( (/\d+\s*(\S+)/)[0]) ] } @data;

如果您需要对多个字段进行排序,以下范例很有用。

@sorted = sort {
    field1($a) <=> field1($b) ||
    field2($a) cmp field2($b) ||
    field3($a) cmp field3($b)
    } @data;

这可以方便地与上面给出的密钥的预先计算相结合。

有关此方法的更多信息,请参阅http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz中“远远超过您想知道的”集合中的排序文章。

另请参阅 perlfaq4 后面关于排序哈希的问题。

于 2010-03-24T23:27:24.960 回答
0

Q1 的答案是:

print "${$aoaoh[0][0]}{$_}=$_\n" for sort keys %{$aoaoh[0][0]};

可以写成:

for (sort keys %{$aoaoh[0][0]}) {
    print "${$aoaoh[0][0]}{$_}=$_\n"
}

Q2的答案:

print "$_->[1]=$_->[0]\n" for
map { [$_->[0], $_->[1]] }
sort { $a->[0] cmp $b->[0] }
map { [ ${$aoaoh[0][0]}{$_}, $_ ] } keys %{$aoaoh[0][0]};
于 2011-05-29T20:33:14.840 回答