[英]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.