我有一個看起來像的哈希
'Jarrod' => {
'Age' => '25 ',
'Occupation' => Student
},
'Elizabeth' => {
'Age' => '18',
'Occupation' => Student
},
'Nick' => {
'Age' => '32 ',
'Occupation' => Lawyer
},
我正在嘗試按年齡對它們進行排序,所以看起來像
'Nick' => {
'Age' => '32 ',
'Occupation' => Lawyer
},
'Jarrod' => {
'Age' => '25 ',
'Occupation' => Student
},
'Elizabeth' => {
'Age' => '18',
'Occupation' => Student
},
但我似乎無法弄清楚如何訪問任何超過年齡的東西。訂購哈希鍵時如何訪問值的值?
uj5u.com熱心網友回復:
具有所示資料的散列變數%h可以按所需順序處理為
use Data::Dump qw(pp); # to print out a complex data structure
say "$_->[0] => ", pp($_) for
map { [ $_, $h{$_} ] }
sort { $h{$b}->{Age} <=> $h{$a}->{Age} }
keys %h;
列印什么(來自下面的完整程式)
Nick => { Age => "32 ", Occupation => "Lawyer" }
Jarrod => { Age => "25 ", Occupation => "Student" }
Elizabeth => { Age => 18, Occupation => "Student" }
請注意,盡管我們不能“對哈希進行排序”,然后讓它成為那樣,因為哈希本質上是隨機的。? 但是我們當然可以按特定順序遍歷和處理元素,例如上面的例子。
解釋:sort依次獲取提交串列的元素對,在變數$a和中可用$b,然后運行我們提供的代碼塊,以便按規定比較它們。在這里,我們讓它根據 key 的值對元素進行比較,從而對元素進行排序Age。
但是,輸出只是按這樣排序的那些鍵!所以我們然后將它傳遞給 a map,它將每個鍵與其 hashref 值組合并回傳這些對,每個都在一個 arrayref 中。用于列印它們,作為實際處理的占位符。
一個完整的程式
use warnings;
use strict;
use feature 'say';
use Data::Dump qw(dd pp);
my %h = (
'Jarrod' => {
'Age' => '25 ',
'Occupation' => 'Student'
},
'Elizabeth' => {
'Age' => '18',
'Occupation' => 'Student'
},
'Nick' => {
'Age' => '32 ',
'Occupation' => 'Lawyer'
},
);
say "$_->[0] => ", pp($_->[1]) for
map { [ $_, $h{$_} ] } sort { $h{$b}->{Age} <=> $h{$a}->{Age} } keys %h;
或者,對于一個可行的模板,更改為類似
my @sorted_pairs =
map { [ $_, $h{$_} ] } sort { $h{$b}->{Age} <=> $h{$a}->{Age} } keys %h;
for my $key_data (@sorted_pairs) {
say $key_data->[0], ' => ', pp $key_data->[1]; # or just: dd $key_data;
# my ($name, $data) = @$key_data;
# Process $data (a hashref) for each $name
}
一旦我們開始為有序資料構建更合適的資料結構,就會有各種選項,包括每個名稱的一個人的 hashrefs,以正確的順序存盤在一個陣列中。最終,所有這些都可以很好地組織在一個班級中。
請注意Sort::Key如何使排序部分變得不那么繁瑣
use Sort::Key qw(rnkeysort); # rn... -> Reverse Numerical
my @pairs = map { [ $_, $h{$_} ] } rnkeysort { $h{$_}->{Age} } keys %h;
排序越復雜(或具體),此模塊的好處就越大。
?例如, 參見keys和perlsec。
uj5u.com熱心網友回復:
您無法對哈希進行排序。哈希的元素本質上是無序的。
如果您只想按順序訪問哈希的元素,您可以通過獲取和排序鍵來實作。
for my $name (
sort { $people{ $b }{ age } <=> $people{ $a }{ age } }
keys( %people )
) {
my $person = $people{ $name };
...
}
或者
use Sort::Key qw( rikeysort );
for my $name (
rikeysort { $people{ $_ }{ age } }
keys( %people )
) {
my $person = $people{ $name };
...
}
如果您需要一個有序的結構,您可以首先將資料轉換為人員陣列。
my @unordered_people =
map { { name => $_, %{ $people{ $_ } } }
keys( %people );
然后排序。
my @ordered_people =
sort { $b->{ age } <=> $a->{ age } }
@unordered_people;
或者
use Sort::Key qw( rikeysort );
my @ordered_people =
rikeysort { $_->{ age } }
@unordered_people;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/425560.html
