LINUX.ORG.RU

История изменений

Исправление zaz, (текущая версия) :

У меня получилось чтото в таком духе - не знаю насколько оно правильно работает и лутчше/хуже того что есть у вас. Но возможно будет полезно ...

#!/usr/bin/perl

use Data::Dumper;

my @meters = (
    {seq=>3, name=>"Їдальня"},
    {seq=>5, name=>"Контора"},
    {seq=>6, name=>"Госпдвір"},
    {seq=>4, name=>"Склад"},
    {seq=>2, name=>"Госпдвір"},
);

sub metOrder {
        my $items  = shift;
        my %minSeq;

        foreach $i (@$items) {
                if((! $minseq{$i->{name}}) or ($minseq{$i->{name}} > $i->{seq})) {
                        $minSeq{$i->{name}} = $i->{seq}
                };
        }

        return sort {
                ($minSeq{$a->{name}} != $minSeq{$b->{name}})
                        ?($minSeq{$a->{name}} <=> $minSeq{$b->{name}})
                        :($a->{seq} <=> $b->{seq})
        } @$items;
}

my @sorted = metOrder( \@meters );

print Dumper( \@sorted );

Исходная версия zaz, :

У меня получилось чтото в таком духе - не знаю насколько оно правильно работает и лутчше/хуже того что есть у вас. Но возможно будет полезно ...

#!/usr/bin/perl

use Data::Dumper;

my @meters = (
    {seq=>3, name=>"Їдальня"},
    {seq=>5, name=>"Контора"},
    {seq=>6, name=>"Госпдвір"},
    {seq=>4, name=>"Склад"},
    {seq=>2, name=>"Госпдвір"},
);

sub metOrder {
        my $items  = shift;
        my %minSeq;

        foreach $i (@$items) {
                if((! $minseq{$i->{name}}) or ($minseq{$i->{name}} > $i->{seq})) {
                        $minSeq{$i->{name}} = $i->{seq}
                };
        }

        return sort {
                ($minSeq{$a->{name}} == $minSeq{$b->{name}})
                        ?($minSeq{$a->{name}} <=> $minSeq{$b->{name}})
                        :($a->{seq} <=> $b->{seq})
        } @$items;
}

my @sorted = metOrder( \@meters );

print Dumper( \@sorted );