簡體   English   中英

如何在Perl中對具有多個鍵的哈希數組進行排序?

[英]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返回-101取決於相對排序。 (對於數字比較,我們將使用$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM