我在我的应用程序上遇到排序功能问题。我需要在lname
下的instructors
键上对哈希哈希值进行排序。遗产
应用程序是用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
中的行顺序。如果有更简单的方法,请告诉我。
先谢谢。
答案 0 :(得分:4)
您需要将每个instructors
数组ref替换为您在foreach
循环中创建的排序版本。这样,您就可以对每个行的教师进行排序。然后,您可以按每行第一个教师的名称对整个$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
}
]