如何在Perl中使用多个键对哈希数组进行排序?

Dav*_*gal 0 sorting perl hash

我在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" }
];
Run Code Online (Sandbox Code Playgroud)

我需要name按键对该列表进行升序和降序排序.我知道Perl sort函数,但这对我来说有点混乱,有哈希和多个键.

我正在尝试这个(关于我在SO上看过的其他问题):

foreach my $key (sort {$%students->{name}}) {
    print $students{$key} . "\n";
}
Run Code Online (Sandbox Code Playgroud)

但它并不完全存在(获得语法错误).

Sob*_*que 5

你不能这样做$key,因为你有一个数组(ref),而不是哈希(ref)$students.(并且数组的每个元素都是哈希引用).

sort你迭代值进行比较元素的列表(例如,阵列的每个元件,或者通过返回每个键keys %hash) -反过来每个元素被分配给$a$b并进行比较.如果指定自定义排序,则应根据元素的相对位置返回负数,零或正数.

'默认'是:

sort { $a cmp $b } @list;
Run Code Online (Sandbox Code Playgroud)

比较字母数字和cmp返回-1,01取决于相对排序.(我们会使用数字比较$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";
}
Run Code Online (Sandbox Code Playgroud)