我在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";
}
但它并不完全存在(获得语法错误)。
答案 0 :(得分:5)
你不能像$key
这样做,因为你有一个数组(ref),而不是$students
中的哈希(ref)。 (并且数组的每个元素都是哈希引用)。
当您sort
迭代比较元素的值列表(例如,数组的每个元素或keys %hash
返回的每个键)时 - 每个元素依次被分配给$a
和$b
并进行比较。如果指定自定义排序,则应根据元素的相对位置返回负数,零或正数。
'默认'是:
sort { $a cmp $b } @list;
比较字母数字和cmp
会根据相对排序返回-1
,0
或1
。 (对于数字比较,我们将使用$a <=> $b
)。我们需要迭代数组的元素(ref),然后通过提取合适的比较值来比较它们。
所以:
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";
}