[英]How to sort this custom hashes of hashes in perl on the value
我在我的应用程序上遇到排序功能问题。 我需要在instructors
下的lname
键上对lname
进行排序。 遗留应用程序是用Perl编写的。
这是我需要排序的哈希的转储。
$VAR1 = {
'instructors' => [
{
'is_placeholder' => 0,
'lname' => 'Lordy',
'name' => 'Daniel Lordy'
},
{
'is_placeholder' => 0,
'lname' => 'Fisher',
'name' => 'Bethy Fisher'
},
{
'is_placeholder' => 0,
'lname' => 'Jaya',
'name' => 'Jennifer Jaya'
},
],
'id' => '1237058',
'XXX' => {
'name' => 'Fall 2015 MFT Master 695',
},
'YYY' => '45'
};
上述结构中的教师键也可以为空。 例如:
$VAR1 = {
'instructors' => [],
'id' => '1237058',
'XXX' => {
'name' => 'Fall 2015 MFT Master 695',
},
'YYY' => '45'
};
在我的应用程序中,用户可以选择根据讲师姓名对列进行排序。 因此,当用户按升序排序时,应用程序应显示在开始时教师为空的行,然后显示其余各行的教师姓名按升序排列的其余行。 反之亦然。
这是我到目前为止尝试过的代码。
if( $sort_order eq 'ASC' ) {
foreach my $elem ( @$course_sections ) {
my @sorted = map { $_->[1] }
sort { $a->[0] cmp $b->[0] }
map { [$_->{'lname'}, $_] } @{$elem->{'instructors'}};
}
if( $sort_order eq 'DESC' ) {
foreach my $elem ( @$course_sections ) {
my @sorted = map { $_->[1] }
sort { $b->[0] cmp $a->[0] }
map { [$_->{'lname'}, $_] } @{$elem->{'instructors'}};
}
我如何获得此@sorted
哈希值会影响@$course_sections
的行顺序。 让我知道是否有更简单的方法可以做到这一点。
提前致谢。
您需要用在foreach
循环中创建的排序版本替换每个instructors
数组ref。 这样,您就可以对每一行的讲师进行排序。 然后,您可以按每行的第一位讲师的姓名对整个$course_sections
进行排序。
# sort the instructors in-place
foreach my $elem (@$course_sections) {
$elem->{'instructors'} = [
map { $_->[1] }
sort { $a->[0] cmp $b->[0] }
map { [ $_->{'lname'}, $_ ] } @{ $elem->{'instructors'} }
];
}
# sort the courses by first instructor
$course_sections = [
map { $_->[1] }
sort { $a->[0] cmp $b->[0] }
map { [ ( $_->{'instructors'}->[0] ? $_->{'instructors'}->[0]->{'lname'} : q{} ), $_ ] }
@$course_sections
];
确保用空字符串替换undef
值,以免cmp
。 我们不应该执行$_->{'instructors'}->[0]->{'lname'} // q{}
因为自动生存可能会在我们的数据结构中产生大量空白。
这是您的示例数据汇总在一起:
my $course_sections = [
{
'instructors' => [
{
'is_placeholder' => 0,
'lname' => 'Lordy',
'name' => 'Daniel Lordy'
},
{
'is_placeholder' => 0,
'lname' => 'Fisher',
'name' => 'Bethy Fisher'
},
{
'is_placeholder' => 0,
'lname' => 'Jaya',
'name' => 'Jennifer Jaya'
},
],
'id' => '1237058',
'XXX' => {
'name' => 'Fall 2015 MFT Master 695',
},
'YYY' => '45'
},
{
'instructors' => [],
'id' => '1237058',
'XXX' => {
'name' => 'Fall 2015 MFT Master 695',
},
'YYY' => '45'
}
];
这是输出,并通过Data :: Printer转储。
\ [
[0] {
id 1237058,
instructors [],
XXX {
name "Fall 2015 MFT Master 695"
},
YYY 45
},
[1] {
id 1237058,
instructors [
[0] {
is_placeholder 0,
lname "Fisher",
name "Bethy Fisher"
},
[1] {
is_placeholder 0,
lname "Jaya",
name "Jennifer Jaya"
},
[2] {
is_placeholder 0,
lname "Lordy",
name "Daniel Lordy"
}
],
XXX {
name "Fall 2015 MFT Master 695"
},
YYY 45
}
]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.