如何根据值对 perl 中的自定义哈希值进行排序
How to sort this custom hashes of hashes in perl on the value
我的应用程序排序功能出现问题。我需要在 instructors
下的 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'
};
上述结构中的instructors键也可以为空。
例如:
$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
中行的顺序。如果有更简单的方法,请告诉我。
提前致谢。
您需要将每个 instructors
数组引用替换为您在 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
}
]
我的应用程序排序功能出现问题。我需要在 instructors
下的 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'
};
上述结构中的instructors键也可以为空。 例如:
$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
中行的顺序。如果有更简单的方法,请告诉我。
提前致谢。
您需要将每个 instructors
数组引用替换为您在 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
}
]