0

我的应用程序的排序功能遇到问题。我需要lnameinstructors. 遗留应用程序是用 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. 让我知道是否有更简单的方法可以做到这一点。

提前致谢。

4

1 回答 1

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
    }
]
于 2017-05-03T10:19:30.053 回答