在Perl中,如何从第二级哈希中按值排序?

在Perl中,如何从第二级哈希中按值排序?,perl,hash,sorting,numbers,ordinal,Perl,Hash,Sorting,Numbers,Ordinal,我想对$hash\u ref进行排序,这样foreach就可以按 my $hash_ref = { one => { val => 1, name => 'one' }, three => { val => 3, name => 'three'}, two => { val => 2, name => 'two' }, }; 有什么建议吗?@sorted\u list是对已排序哈希元素的引用数组: $ha

我想对
$hash\u ref
进行排序,这样foreach就可以按

my $hash_ref = {
    one   => { val => 1, name => 'one'  },
    three => { val => 3, name => 'three'},
    two   => { val => 2, name => 'two'  },
};

有什么建议吗?

@sorted\u list
是对已排序哈希元素的引用数组:

$hash_ref->{$key}->{'val'}

one
two
three

哈希表没有任何特定的顺序。但是,您可以对数组中的键进行排序,并使用该排序遍历哈希:

1 : one
2 : two
3 : three
my$hash\u ref={
一=>{val=>1,name=>'one'},
三=>{val=>3,name=>'three'},
二=>{val=>2,name=>'two'},
};
严格使用;
使用警告;
使用Lingua::EN::Words2Nums;
foreach my$key(排序{words2nums($a)words2nums($b)}键%$hash_ref)
{
#使用$hash_ref->{$key}
打印“处理密钥$key.\n”;
}
您可以定义任何您喜欢的排序方法;有关更多详细信息,请参阅。从序数数字文本到算术值的转换是使用(它也使用基数)完成的。

使用strict;
使用警告;
我的%hash\u ref=(
一=>{val=>1,name=>'one'},
三=>{val=>3,name=>'three'},
二=>{val=>2,name=>'two'},
);
foreach my$key(排序{$hash_ref{$a}{val}$hash_ref{$b}{val}}key%hash_ref){
my$value=$hash_ref{$key}{val};
my$name=$hash_ref{$key}{name};
打印“$name->$value\n”;
}
输出:
一->一
二->二
三->三
#/usr/bin/perl
我的$hash\u ref=(
一=>{val=>1,name=>“一”},
三=>{val=>3,name=>“三”},
二=>{val=>2,name=>'two'},
);
foreach$elem(排序{$$hash_ref{$a}{val}$$hash_ref{$b}{val}}}键%$hash_ref){
my$value=$hash_ref->{$elem}{val};
my$name=$hash_ref->{$elem}{name};
打印“$name->$value\n”;
}
输出:
一->一
二->二
三->三

Heh。我非常专注于根据英文数字文本进行排序,以至于我没有注意到“val”子键。尽管如此,Lingua::EN::Words2Nums意味着您根本不必拥有这些子键——您可以仅对更高级别的键进行排序。:)我从没听说过Lingua!虽然很有趣,但总有一天我会好好利用它!
#!/usr/bin/perl

my $hash_ref = {
    one   => { val => 1, name => 'one' },
    three => { val => 3, name => 'three' },
    two   => { val => 2, name => 'two' },
};

foreach $elem ( sort { $a->{'val'} <=> $b->{'val'} } values %{$hash_ref} ) {
    print "$elem->{'val'} : $elem->{'name'}\n";
}
1 : one
2 : two
3 : three
my $hash_ref = {
    one => { val => 1, name => 'one'},
    three => { val => 3, name => 'three'},
    two => { val => 2, name => 'two'},
};

use strict;
use warnings;
use Lingua::EN::Words2Nums;

foreach my $key (sort { words2nums($a) <=> words2nums($b) } keys %$hash_ref)
{
    # do something with $hash_ref->{$key}
    print "processing key $key.\n";
}
use strict;
use warnings;

my %hash_ref = (
one   => { val => 1, name => 'one'  },
three => { val => 3, name => 'three'},
two   => { val => 2, name => 'two'  },
);

foreach my $key(sort {$hash_ref{$a}{val} <=> $hash_ref{$b}{val}} keys %hash_ref) {
my $value = $hash_ref{$key}{val};
my $name = $hash_ref{$key}{name};
print "$name -> $value\n";
}

output:
one -> 1
two -> 2
three -> 3
#!/usr/bin/perl


my $hash_ref = (
                one   => {val => 1,  name => "one"},
                three => {val => 3,  name => "three"},
                two   => {val => 2,  name => 'two'},
               );

foreach $elem( sort {$$hash_ref{$a}{val} <=> $$hash_ref{$b}{val}} keys %$hash_ref){
    my $value = $hash_ref->{$elem}{val};
    my $name = $hash_ref->{$elem}{name};
    print "$name -> $value\n";
}

OutPut:
one -> 1
two -> 2
three -> 3