Как выполнить обратную сортировку массива, сортировка начинается в конце строки - PullRequest
0 голосов
/ 01 октября 2018

У меня есть куча адресов в базе данных LDAP, и я хочу удалить улицу.Для этого я должен удалить дома в первую очередь.Вывод базы данных LDAP не отсортирован

my @x1=("c=NL",
        "nr=1,s=Dam,a=AMS,c=NL",
        "s=Dam,a=AMS,c=NL",
        "a=AMS,c=NL",
        "nr=3,s=Plein,a=AMS,c=NL",
        "s=Plein,a=AMS,c=NL",
        "nr=2,s=Dam,a=AMS,c=NL"   );

Прежде чем мы сможем удалить 's = Dam', мы должны удалить 'nr = 1, s = Dam, a = AMS, c = NL' и "nr = 2, s = Dam, a = AMS, c = NL ", прежде чем мы сможем удалить" s = Dam, a = AMS, c = NL "

В качестве направления я выбрал сортировку строк от конца доспереди, поэтому сначала «c = NL», затем «a = AMS» и так далее.И затем пробег через массив, если он содержал «s = Dam, a = AMS, c = NL».

В результате должен выглядеть, как:

    'nr=2,s=Dam,a=AMS,c=NL'
    'nr=1,s=Dam,a=AMS,c=NL'
    's=Dam,a=AMS,c=NL'

Я добавил Data :: Dumper в код, чтобы показать, что происходит

    my @x1=("c=NL",
            "nr=1,s=Dam,a=AMS,c=NL",
            "s=Dam,a=AMS,c=NL",
            "a=AMS,c=NL",
            "nr=3,s=Plein,a=AMS,c=NL",
            "s=Plein,a=AMS,c=NL",
            "nr=2,s=Dam,a=AMS,c=NL"   );
    print Data::Dumper->Dump([\@x1],['*x1']);

    my @x2=split( "\n", reverse join ("\n", @x1));
    print Data::Dumper->Dump([\@x2],['*x2']);

    my @x3=sort @x2;
    print Data::Dumper->Dump([\@x3],['*x3']);

    my @x4=split( "\n", reverse join ("\n", @x3));
    print Data::Dumper->Dump([\@x4],['*x4']);

    foreach (@x4) {
      # if matches from the rear: "s=Dam,a=AMS,c=NL", do stuff
    }

это результат

@x1 = (
        'c=NL',
        'nr=1,s=Dam,a=AMS,c=NL',
        's=Dam,a=AMS,c=NL',
        'a=AMS,c=NL',
        'nr=3,s=Plein,a=AMS,c=NL',
        's=Plein,a=AMS,c=NL',
        'nr=2,s=Dam,a=AMS,c=NL'
     ); @x2 = (
        'LN=c,SMA=a,maD=s,2=rn',
        'LN=c,SMA=a,nielP=s',
        'LN=c,SMA=a,nielP=s,3=rn',
        'LN=c,SMA=a',
        'LN=c,SMA=a,maD=s',
        'LN=c,SMA=a,maD=s,1=rn',
        'LN=c'
      ); @x3 = (
        'LN=c',
        'LN=c,SMA=a',
        'LN=c,SMA=a,maD=s',
        'LN=c,SMA=a,maD=s,1=rn',
        'LN=c,SMA=a,maD=s,2=rn',
        'LN=c,SMA=a,nielP=s',
        'LN=c,SMA=a,nielP=s,3=rn'
      ); @x4 = (
        'nr=3,s=Plein,a=AMS,c=NL',
        's=Plein,a=AMS,c=NL',
        'nr=2,s=Dam,a=AMS,c=NL',
        'nr=1,s=Dam,a=AMS,c=NL',
        's=Dam,a=AMS,c=NL',
        'a=AMS,c=NL',
        'c=NL'
      );

Можно ли улучшить этот код, чтобы код мог быть более читабельным,

1 Ответ

0 голосов
/ 01 октября 2018
sub reverse_terms { join ',', reverse split /,/, $_[0] }

my @sorted =
   map reverse_terms($_),
   reverse sort
   map reverse_terms($_),
   @unsorted;

или

use Sort::Key qw( rkeysort );

my @sorted = rkeysort { join ',', reverse split /,/ } @unsorted;

Приведенные выше решения преобразуют

s=Dam,a=AMS,c=NL
nr=1,s=Dam,a=AMS,c=NL

в

c=NL,a=AMS,s=Dam
c=NL,a=AMS,s=Dam,nr=1

Затем они сортируют преобразованные строки вв порядке убывания.Это заставляет детей появляться перед родителями.

c=NL,a=AMS,s=Dam,nr=1
c=NL,a=AMS,s=Dam

Наконец, это просто вопрос преобразования строки обратно (или возврата исходной строки, в случае rkeysort).

...