繁体   English   中英

如何在Perl上对值的自定义哈希值进行排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM