timothy: Redundanzen aus einer Liste entfernen

Hi folks

folgende Problemstellung:
Es existiert eine sortierte Liste @include mit Directory-Namen

n:/apache/
n:/apache/conf/
n:/apache/htdocs/
n:/downloads/
n:/eigene dateien/dokus/cgi/
n:/eigene dateien/dokus/cgi/cgi101/
n:/eigene dateien/exceldat/
n:/eindir/
n:/eindir/cvstest/cvs/root
n:/mercury/

(z.B. sollen diese Verzeichnisse inkl. Unterverzeichnissen gesichert werden).

Klar ist, dass in dieser Liste Redundanzen enthalten sind. Wenn ich "n:/apache/" sichere (inkl. aller Unterverzeichnisse), dann sichere ich logischer weise auch "n:/apache/htdocs/" usw. Wie kann man dies möglichst effektiv und elegant lösen, so daß @newinclude wie folgt aussieht.

n:/mercury/
n:/eindir/
n:/eigene dateien/exceldat/
n:/eigene dateien/dokus/cgi/
n:/downloads/
n:/apache/

Ich habe z.Zt. folgende wilde ;-) Konstruktion, die auch funktioniert:

<snippet>

#Redundanzen entfernen
my $pushen = 0;
for (my $i = scalar @include -1 ; $i > 0; $i--)
{
     if ($pushen)
     {
        push (@newinclude,$include[$i+1]);
        $pushen--;
     }
     $pushen++;
     for (my $y = $i-1; $y >= 0; $y--)
     {
        if ($include[$i] =~ /^$include[$y]/)
        {
           $pushen--;
           last;
        }
     }
}
push (@newinclude, $include[0]);

</snippet>

Vielleicht hat ja jemand Lust, sich da mal durch zuwühlen. Oder hat ein entsprechendes Muster zur Hand ;-)
Und bitte nicht sagen, die Redundanzen _dürfen_ in @include nicht sein. Angenommen, das zugehörige XML-File wurde von einem DAU per Hand erstellt.
Können wir uns darauf einigen?

Bye
Timothy

  1. Hallo,

    Zwei Vorschläge:

    Sortiere die Liste und prüfe beim Durchlaufen dieser Liste, ob das Element vor dem zu überprüfenden Element in diesem enthalten ist (regex oder substr). Wenn ja, entferne das Element aus der Liste.

    Oder, wenn Du wirklich mit zwei Listen arbeiten willst, vergleiche das aktuelle Element der ersten mit dem zuletzt eingefügten der zweiten Liste. Wenn keine Übereinstimmung vorliegt, übernimmst Du das Element.

    Grüße
      Klaus

    1. Hi Klaus,

      Sortiere die Liste ...prüfe ...diese Liste, ob das Element vor dem zu überprüfenden Element in diesem
      enthalten ist (regex oder substr ...Wenn keine Übereinstimmung vorliegt, übernimmst Du das Element.

      Genau dies macht ja mein Konstrukt.

      @include ist die sortierte Liste. Anschließend wird von hinten an begonnen zu vergleichen

      ($include[$i] =~ /^$include[$y]/)

      und, bei nicht Übereinstimmung, das Element in @newinclude übernommen.

      Bye
      Timothy

      --
      Zwei Dinge im Leben kannst du nicht zurück holen. Den Pfeil, den du verschossen. Und das Wort, das du gesprochen.
      (alte indianische Weisheit)
      1. Hallo,

        Sortiere die Liste ...prüfe ...diese Liste, ob das Element vor dem zu überprüfenden Element in diesem
        enthalten ist (regex oder substr ...Wenn keine Übereinstimmung vorliegt, übernimmst Du das Element.

        Genau dies macht ja mein Konstrukt.

        hmm, laß es mich ausformulieren:
        <code>
        my $i=0;
        @include = sort @include;
        while($i<scalar @include) {
           if(($i>0) and ($include[$i] =~ /$include[$i-1]/)) {
              splice(@include,$i,1);
              }
           else {
              $i++;
              }
           }
        </code>
        Na, sieht ja schon viel netter aus, oder?

        Grüße
          Klaus

        1. Hi Klaus,

          Na, sieht ja schon viel netter aus, oder?

          Funzt ja richtig gut - ist ist ja schon viel eleganter als meine drei.-, vier-, fünffach Schleifen ;-)

          Besten Dank
          Timothy

          --
          Zwei Dinge im Leben kannst du nicht zurück holen. Den Pfeil, den du verschossen. Und das Wort, das du gesprochen.
          (alte indianische Weisheit)