在数组ref perl中排序散列引用

时间:2016-01-05 09:59:23

标签: perl

我有以下结构......

 my $categories = { $category => [
                                  {
                                   id => 1,
                                   title => "title1",
                                   sort_order => 1
                                  },
                                  {
                                   id => 13,
                                   title => "title2",
                                   sort_order => 2
                                  },
                                  {
                                   id => 15,
                                   title => "title3",
                                   sort_order => 3
                                  }

 ] };

有人能告诉我是否有办法根据sort_order对结果进行排序?

3 个答案:

答案 0 :(得分:4)

设置一个方法,让sort()使用并从这个

创建一个新数组
use strict;
use warnings;

use Data::Dumper;
my $category="wombats";

 my $categories = { $category => [
                                  {
                                   id => 1,
                                   title => "title1",
                                   sort_order => 1
                                  },
                                  {
                                   id => 13,
                                   title => "title2",
                                   sort_order => 2
                                  },
                                  {
                                   id => 15,
                                   title => "title3",
                                   sort_order => 3
                                  }

 ] };


my @sorted = sort { $a->{sort_order} <=> $b->{sort_order} } @{$categories->{$category}};

print "by sort_order\n";
print Dumper(@sorted);

my @sorted2 = sort { $b->{id} <=> $a->{id} } @{$categories->{$category}};

print "by reverse id\n";
print Dumper(@sorted2);

答案 1 :(得分:1)

最简单的方法是使用List::UtilsBy

中的nsort_by

这是一个例子。我假设您的示例数据中的密钥$category应为category

use strict;
use warnings 'all';

use List::UtilsBy qw/ nsort_by /;

my $categories = {
    category => [
        {   id         => 1,
            title      => "title1",
            sort_order => 1
        },
        {   id         => 13,
            title      => "title2",
            sort_order => 2
        },
        {   id         => 15,
            title      => "title3",
            sort_order => 3
        },

    ]
};

my $list = $categories->{category};

for my $item ( nsort_by { $_->{sort_order} } @$list ) {

  printf "sort order: %d\n", $item->{sort_order};
  printf "id:         %d\n", $item->{id};
  printf "title:      %s\n", $item->{title};
  print "\n";
}

输出

sort order: 1
id:         1
title:      title1

sort order: 2
id:         13
title:      title2

sort order: 3
id:         15
title:      title3

但是,如果您没有安装模块(它不是核心模块),那么你可以使用基本的Perl这样做,结果相同

for my $item ( sort { $a->{sort_order} <=> $b->{sort_order} } @$list ) {

  printf "sort order: %d\n", $item->{sort_order};
  printf "id:         %d\n", $item->{id};
  printf "title:      %s\n", $item->{title};
  print "\n";
}

答案 2 :(得分:0)

sort功能允许您通过函数将任意条件应用于排序。

此功能应该依次设置为每个记录的$a$b。它应该返回-10+1(或任何正/负数 - 符号是重要的),具体取决于相对位置。

根据你的筑巢深度,这有点复杂。您可以使用以下方式排序:

sort { $a -> {sort_order} <=> $b -> {sort_order} } @stuff; 

将比较这些值并为您提供有序的结果。

要从数据中获取该数组,您需要取消引用。 $category是您示例中的变量 - 您的意思是使用它吗?无论如何,给你的东西:

 @{$categories -> {$category}} 

所以:

sort { $a -> {sort_order} <=> $b -> {sort_order} } @{$categories -> {$category}}

您可以在for循环中使用:

foreach my $thing ( sort { $a -> {sort_order} <=> $b -> {sort_order} } @{$categories -> {$category}} ) {
    print $thing -> {title},"\n";
}