Philipp Hasenfratz: verschachtelte Datenstruktur

Beitrag lesen

Halihallo $xNeTworKx

In der Subroutine soll nun geprüft werden, ob der Name mit dem zugehörigen Passwort auch in den "Userdateien" vorkommt. Wenn ja, soll der Dateiname zurückgeliefert werden, in dem der Name und das Passwort vorkommt.

Warum also erst _alle_ Daten einlesen? - Es wäre wesentlich klüger, jede Datei
einzulesen, die relevanten Daten zu extrahieren und mit den Prozedurparametern zu
vergleichen, falls übereinstimmung zurückgeben. Das spart a) Speicher b) Performance.

Zuerst dachte ich an eine Lösung mit Hashes, aber ich habe ja 3 Elemente, wodurch ich dann an ein Array auf ein Array dachte.

Hash wäre, wenn ich alles richtig durchschaut habe, klüger. Der Hashkey wäre Username,
Hashvalue eine Arrayreferenz mit Pwd und Dateiname. Am Ende könntest du auf den Hash mit
dem Usernamen aus den Prozedurparametern zugreifen und hättest deine Daten; falls Wert
undef existiert der User nicht.
Du schreibst in deinem Beispiel:

@{ $members[$i] }[0..2] = (lc $inputname,$inputpasswort,$_);

damit setzt du einen Splice (Teil des Arrays) mit neuen Werten, das ist nicht in deinem
Sinne, richtig wäre:

$members[$i] = [lc $inputname, $inputpasswort, $_]

also: Du hast ein Array @members; jeder neue Member trägt den Index $i. An der Stelle
$i, wird nun ein neuer Member eingefügt. Was ist dieser Member? - Richtig, nach deiner
Aussage ein neues Array. Aber: Ein Element eines Arrays ist und wird es immer bleiben:
ein _Skalar_; wenn du also "Arraydaten" in einem Element eines Arrays speichern musst,
musst du eine Arrayreferenz bilden (mit den eckigen Klammern), denn nur eine
Arrayreferenz ist ein Skalar. Ich glaube du wurdest schon einige male auf
perldoc perlref | perldata | perlreftut | perllol (letzteres solltest du dir vorallem
mal ansehen, da genau für dein jetztiges Vorhaben relevant) verwiesen, du solltest es
wirklich mal durchlesen.

Dummerweise hab ich von verschachtelten Datenstrukturen nur wenig Ahnung, was die ganze Sache ziemlich erschwert.

s. oben

Im Moment liefert die Subroutine noch nicht die gewüschte Datei zurück, und ich habe wirklich keine blassen Schimmer, was alles falsch sein könnte, aber vielleicht könnte mal jemand ein Blick darauf werfen, danke.

while (defined($_ = readdir(DIR)))   {
              ^^^^

ist nicht ratsam, wohl möglich, aber nicht ratsam. $_ ist sozusagen eine "Systemvariable"
und diese solltest du wirklich nicht selber setzen. Verwende stattdessen einen sinnvollen
Namen.
Und wie ganz oben geschrieben: Deine Datenstruktur brauchst du gar nicht, sie
verschwendet nur Performance und Speicher!

Viele Grüsse und HTH

Philipp