LINUX.ORG.RU

Сортировка массива хэшей по определенному полю хэша

 ,


0

1

Есть массив @array состоящий из хэшей %hash, в каждом хэше есть поле %hash{id}, как отсортировать хэши в массиве по этому полю?

#!/usr/bin/perl
use strict;
use warnings;

my $a=2;
my $b=5;
my $c=1;
my %hash;
my @array;

%hash=('id'=>$a);
push (@array,{%hash});

%hash=('id'=>$b);
push (@array,{%hash});

%hash=('id'=>$c);
push (@array,{%hash});
          
foreach (@array) {
    print @$_{id}, "\n";
}

exit 0

на выходе имеем.

2 5 1

а надо получить.

1 2 5


#!/usr/bin/perl

use 5.010;
use strict;
use warnings;
use Data::Dumper;


our $array = [
	{
		'id' => 2
	},
	{
		'id' => 5
	},
	{
		'id' => 1
	}
];

say Dumper($array);

my @sorted = sort { $a->{id} <=> $b->{id} } @{$array};

say "Sorted:";
say Dumper(\@sorted);
joy4eg ★★★★★
()

правильный вариант сортировки в моём случае такой получился:

@array = sort { $a->{id} <=> $b->{id} } @array;

karasic
()
%hash=('id'=>$b);

1) не экономь на пробелах, иначе код выглядит как говно 2) кавычки вокруг id необязательны, => уже их подставляет аргументу слева автоматом.

push (@array,{%hash});

Лишний конструктор хэша, можно написать просто \%hash

my $a=2;
my $b=5;
my $c=1;

my ($a, $b, $c) = (2, 5, 1);

foreach (@array) {
    print @$_{id}, "\n";
}

1) @$_ — double sigils are deprecated 2) сама конструкция пишется как $_->{id} 3) не надо злоупотреблять $_

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.