|
|
 |

|

 |

| Community » Perl: Allgemeines Forum |
|
Array Probleme
|
Seitenanfang |
| Hi, Ich hab folgende Probleme. Wie kann ich den Inhalt eines kompletten Arrays löschen? mit @array = undef; ist nur @array[0] undefiniert... Und nochwas. In dem Array können die Inhalte auch mehrfach vorkommen. Ich will aber jedes nur einmal ausgeben. Auch wenn beispielsweise der name root 5 mal drin steht und home 8 mal. Wie kann ich das machen? thx schonmal!
Datum: 04.04.2005-12:26

|
re: Array Probleme
|
Seitenanfang |
Wie wärs mit undef @array; # Dabei wird der komplette Array zerstört# oder @array = (); # Dabei wird der Array nur geleert, jedoch nicht zerstört., bzw. wird er da nicht einfach nur neu (leer) angelegt und dadurch der vorhergehende gelöscht?!?
Grüßle Leprechaun
Datum: 04.04.2005-15:06

|
re: Array Probleme
|
Seitenanfang |
Hallo auch, so könnte eine recht einfache, elegante Lösung Deines zweiten Problems aussehen. Das ganze funktioniert weil in einem Hash jeder Schlüssel (hier der Arrayinhalt) nur genau einmal existieren kann. Auf diese Art und Weise erspart man dem Server und Interpreter viel Arbeit indem man auf diverse Schleifen o. ä. zum Vergleichen verzichtet. my @array = ('root','home','root','root','home'); #Doppelte Einträge löschen undef %helperhash; @helperhash{@array} = (); @array_with_content_to_show = sort keys %helperhash;
Grüßle Leprechaun
Datum: 04.04.2005-16:44

|
re: Array Probleme
|
Seitenanfang |
Hmm, ich versteh die Erklärung nicht ganz... Ich hab irgendwie generell mit hashes noch nicht so viel gemacht... Aber die Liste stimmt dann doch nicht mehr. Das Programm, das ich schreibe ist ein Bruteforce tool mit Perl TK (Passwortknacker). Wenn ich das in ein Hash packe, stimmen die Passwörter doch nicht mehr zu den Benutzern, oder? Ich hab den Code gerade nicht hier. Aber das sieht dann in etwa so aus:
open (PASSWD, "</etc/passwd"); open (WORD, "</home/wordlist.txt"); while(<PASSWD>) { ($user, $passwd) = split(/:/); if ($passwd eq "") { push @array, "$user\n"; push @passwd, "Kein Passwort\n"; } elsif ($passwd eq "*" || $passwd eq "*******" || $passwd eq "!" || $passwd eq "!!") { push @array, "$user\n"; push @passwd, "Dienst abgeschaltet\n"; } while (defined ($line = <WORD>) { $pass = crypt($line, $passwd); if ($pass eq $passwd) { push @array, $user; push @passwd, $pass; } $pass1 = crypt($user, $passwd); elsif ($user eq $pass1) { push @array, $user; push @passwd, $user; } } } print @array; print @passwd;
Wie gesagt, ist nicht der originalcode und @array hat dann mehrere Male einen Benutzer. Wie kann ich das verhindern. Und die ausgabe steht natürlich nebeneinander in einer tk tabelle. thx schonmal!
Datum: 06.04.2005-14:07

|
re: Array Probleme
|
Seitenanfang |
Die Methode die ich Dir da aufgezeigt habe funktioniert im Prinzip so: Du hast einen Array mit vielen doppelten Einträgen, diese doppelten willst Du raus (gelöscht) haben aus dem Array.
my @array = ('root','home','root','root','home');
Nun greifst Du einfach auf die Eigenschaft von Hashes zurück, dass dort nämlich jeder Schlüssel nur einmal vorkommen darf. Nun befüllst du einfach den Hash mit dem Inhalt des Array und zwar immer als Schlüssel ohne Wert dazu.
Doppelte Einträge löschen undef %helperhash; @helperhash{@array} = ();
Wenn nun ein Schlüssel schon vorhanden ist kann der ja nicht nochmal im Hash vorkommen, was soviel heißt wie wenn Du 2 mal "root" als Schlüssel einfügen willst, funktioniert das nicht und es wird nur einmal in den Hash eingefügt. Wenn dieser Vorgang fertig ist kannst Du die Einträge des Hashes wieder in den (oder einen anderen) Array packen
@array_with_content_to_show = sort keys %helperhash;
und schwupps hast Du in dem Array keine doppelten Einträge mehr.Gruß Leprechaun
Datum: 06.04.2005-15:06

|
re: Array Probleme
|
Seitenanfang |
Hmm, das ist gut durchdacht. Auf sowas wäre ich von alleine nie gekommen! Kann ich mir auch irgendwie anzeigen lassen, welche positionen aus dem array genommen wurden? Weil ich diese positionen in meinem passwd array ja cuh rausnehmen muss, damit es wieder passt...Danke auf jeden Fall! ! !
Datum: 06.04.2005-15:37

|
re: Array Probleme
|
Seitenanfang |
Das wird in dem Fall schwierig, da man das ganze ja bei dieser Vorgehensweise nicht in einer Schleife durchgeht wo man einfach die Position ausmachen kann. Was Du mal versuchen kannst ist anstatt
@helperhash{@array} = ();
einfach
@helperhash{@array} = (@PWDs);
und beim zurückschreiben dann
while(my ($key,$value)= each %helperhash) { push(@array_unique_names,$key); push(@array_with_PWDs,$value); }
... das würde mir zu der Problematik so spontan noch einfallen, allerdings weiß ich nicht ob das so funktioniert. Grüßle Leprechaun
Datum: 06.04.2005-16:36

|
re: Array Probleme
|
Seitenanfang |
Noch einfacher:
my @array = qw(root root home home root root root home); my %seen; my @unique = grep{!$seen{$_}++}@array;
Datum: 06.04.2005-16:41

|
|

|

|

|
 |

|

|
|