Redundanzen aus einer Liste entfernen
timothy
- perl
0 Klaus Mock0 timothy0 Klaus Mock0 timothy
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
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
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
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
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