[英]How to sort an array of hashes with multiple keys in Perl?
我引用了Perl中的哈希列表,如下所示:
my $students = [
{ name => "Johnson", age => 19, gpa => 2.5, major => "CS" },
{ name => "Jones", age => 18, gpa => 2.0, major => "IT" },
{ name => "Brown", age => 19, gpa => 2.2, major => "SE" }
];
我需要按name
键对列表进行升序和降序排序。 我知道Perl的sort
功能,但是哈希和多个键使我有些困惑。
我正在尝试这样做(摆脱了我在SO上看到的其他问题):
foreach my $key (sort {$%students->{name}}) {
print $students{$key} . "\n";
}
但这还不完全存在(出现语法错误)。
不能用$key
这样,因为您在$students
有一个array(ref),而不是hash(ref)。 (并且数组的每个元素都是一个哈希引用)。
当您sort
将迭代一个比较元素值的列表(例如,数组的每个元素或keys %hash
返回的每个键)-每个元素又分配给$a
和$b
并进行比较。 如果指定自定义排序,则它应基于元素的相对位置返回负,零或正。
“默认”为:
sort { $a cmp $b } @list;
其中字母数字进行比较,并且cmp
返回-1
, 0
或1
取决于相对排序。 (对于数字比较,我们将使用$a <=> $b
)。 我们需要迭代数组的元素(参考),然后通过提取合适的比较值来进行比较。
所以:
use strict;
use warnings;
my $students = [
{ name => "Johnson", age => 19, gpa => 2.5, major => "CS" },
{ name => "Jones", age => 18, gpa => 2.0, major => "IT" },
{ name => "Brown", age => 19, gpa => 2.2, major => "SE" }
];
foreach my $hashref ( sort { $a -> {name} cmp $b -> {name} } @$students ) {
print $hashref -> {name},"\n";
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.