mike1980: Frage zu Hash-Variablen: Wie notiere ich mehrere Datensätze?

Hallo alle zusammen,

ich mache derzeit einen Fernlehrkurs, in dem momentan PERL behandelt wird. Leider erreiche ich auf die Schnelle niemanden, hätte aber dennoch eine (vermutliche Anfänger-) Frage:

Ich soll für eine Aufgabe eine einfache User-Kennwort-Abfrage zum Ausführen über die Command / Shell mittels PERL erstellen. Dazu soll ich eine Hash-Variable nutzen, um die User und Passwörter zu hinterlegen. Ich hab jetzt glaub zwei Tage gegoogle't, wurde aber nicht wirklich fündig (mein Lehrheft hilft mir da auch nicht wirklich weiter ...) und auch das 'Try-and-Fail' wird langsam langweilig. Zu meiner eigentlichen Frage:

Ich lese überall, dass ein Hash folgend notiert wird:

  
%adresse = ("Vorname"  => "Stefan",  
            "Nachname" => "Schultz",  
            "Ort"      => "Berlin");

Soweit so klar - aber ich finde hier überall nur Beispiele mit einem Datensatz, wie muss ich den zweiten Datensatz hinzugeben? Stimmt meine Annahme, dass ich meine Daten wie folgt notieren muss:

  
%zugangsdaten = ("User"  => "Stefan", "Martin",  
                 "Pass"  => "user1", "user2");

Zwar hatte ich das Skript schon mit diesem Aufbau versucht, scheiterte dann aber an der Ausgabe der Variablen (wollte zum prüfen eine Ausgabe per Print-Funktion machen, um zu sehen, ob die Datenpaare zusammenpassen).

Ich erhalte in diesem Fall dann immer nur die "Pass"-Einträge, allerdings interessanterweise immer nach folgender Reihenfolge: user5, user1, user4, user3, user2...

Zur Abfrage nutzte ich folgenden Code (bin kein PERL-Profi, Verbesserungsvorschläge und Korrekturen gerne erwünscht):

  
foreach $schluessel (keys %zugangsdaten)  
   {  
   print ($schluessel, "   ", $zugangsdaten($schluessel), "\n");  
   }

Auch im Online-Handbuch von PERL werde ich irgendwie auch nicht fündig - hab ich da einen kompletten Denkfehler in meinem Skript, bzw. wie ich es angehe?

Das nächste Problem sehe ich kommen, wie ich die Hash-Einträge mit den beiden Variablen für die <STDIN>-Eingaben gegen+berstellen kann..

Ich wollte so vorgehen:

  • Mittels der foreach-Zeile / keys die Datensatz-Anzahl des Hashes auslesen
  • Über eine Schleife die Datensatznummer der Hash-Einträge user einzeln lesen und mit der Benutzereingabe über <STDIN> prüfen
      -> Wenn der eingegebene User nicht mit dem Feldwert übereinstimmt, Schleife fortsetzen
      -> Bei übereinstimmung den akuellen Datensatz verwenden, um das pass-Feld des Hashes mit der <STDIN>-Eingabe des Users zu vergleichen

Zu guter letzt mein derzeitiges Skript, vielleicht könnt ihr mir einen Tipp geben:

  
#!c:/perl/bin/perl -w  
  
# Variablen initialisieren  
$usereing = ""    # Variable fuer die Benutzerabfrage  
$passeing = ""    # Variable fuer die Kennwortabfrage  
  
# Hash-Daten definieren  
%zugangsdaten = ("User" => "Stefan", "Martin", "Thomas", "Robert", "Gerhard",  
                 "Pass"  => "user1", "user2", "user3", "user4", "user5");  
  
# Benutzer-Eingabe fuer User und Kennwort  
print ("User eingeben: ";  
chomp ($usereing = <STDIN>);  
print ("\nPasswort eingeben: ";  
chomp ($passeing = <STDIN>);  
print ("\n\n");  
  
# Testzeile zum Auswurf der Datensatzpaare  
foreach $schluessel (keys %zugangsdaten)  
   {  
   print ($schluessel, "   ", $zugangsdaten($schluessel), "\n");  
   }  
  
# Schleife zur Gegenueberstellung der ausgelesenen Feldwerte mit der Benutzereingabe

Hoffe auf brauchbare Antworten oder einen guten Link, der meinen Fehler beschreibt und löst - denke aber, ich hab da einen gravierenden Denk- oder Ansatzfehler...

LG Mike

  1. Hallo alle zusammen,

    Hallo

    ich mache derzeit einen Fernlehrkurs, in dem momentan PERL behandelt wird. Leider erreiche ich auf die Schnelle niemanden, hätte aber dennoch eine (vermutliche Anfänger-) Frage:

    OK

    Ich soll für eine Aufgabe eine einfache User-Kennwort-Abfrage zum Ausführen über die Command / Shell mittels PERL erstellen. Dazu soll ich eine Hash-Variable nutzen, um die User und Passwörter zu hinterlegen. Ich hab jetzt glaub zwei Tage gegoogle't, wurde aber nicht wirklich fündig (mein Lehrheft hilft mir da auch nicht wirklich weiter ...) und auch das 'Try-and-Fail' wird langsam langweilig. Zu meiner eigentlichen Frage:

    Ich lese überall, dass ein Hash folgend notiert wird:

    %adresse = ("Vorname"  => "Stefan",
                "Nachname" => "Schultz",
                "Ort"      => "Berlin");

      
    Soweit korrekt.  
      
    
    > Soweit so klar - aber ich finde hier überall nur Beispiele mit einem Datensatz, wie muss ich den zweiten Datensatz hinzugeben? Stimmt meine Annahme, dass ich meine Daten wie folgt notieren muss:  
    >   
    >   
    > ~~~perl
      
    
    > %zugangsdaten = ("User"  => "Stefan", "Martin",  
    >                  "Pass"  => "user1", "user2");
    
    

    Nein. Du möchtest einen Hash ganz einfach so erweitern.

    Folgendes sind Äquivalente

    a)

    my %zugangsdaten = (); # initialisiere einen leeren Hash
    $zugangsdaten{Stefan} = "user1";
                           # Weise dem Schlüssel "Stefan" den Wert "user 1" zu

    und b)

    my %zugangsdaten = ( Stefan => "user1");

    Ich komme jetzt auf deine Struktur:

    %zugangsdaten = ("User"  => "Stefan", "Martin",
                     "Pass"  => "user1", "user2");

      
    Das ist gelinde gesagt, ein Perl Error, der kein Error anzeigt  
    Denn => ist das gleiche wie ein Komma  
      
    Du hast also geschrieben:  
    %zugangsdaten = (  
          "User"  => "Stefan",  
          "Martin", "Pass"  =>  
            "user1", "user2");  
    [/code]  
      
    Das hast du wohl nicht gemeint.  
      
    Was annähernd ähnlich deiner Absicht ist:  
      
    ~~~perl
      
    %zugangsdaten = (  
            "User"  => ["Stefan", "Martin"],  
            "Pass"  => ["user1", "user2"],  
            );  
    
    

    Hier haben wir einen Hash of Arrays.
    Die Array sind aber anonyme Arrayreferenzen.

    Das ist eine blöde Struktur um nach dem namen oder dem passwort zu suchen,
    weil beide nicht schlüssel, sondern anonyme Elemente im Array sind.
    Du müsstest über den ganzen Hash iterieren, um nur den Namen zu finden.

    Mal nur das.

    mfg Beat

    --
    Woran ich arbeite:
    X-Torah
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
  2. Hoffe auf brauchbare Antworten oder einen guten Link, der meinen Fehler beschreibt und löst - denke aber, ich hab da einen gravierenden Denk- oder Ansatzfehler...

    http://perldoc.perl.org/perldsc.html

    Struppi.

  3. Einen schönen Dank an Beat und Struppi,

    hilft mir beides schon um einges weiter! Also die Beanwortungsgeschwindigkeit hier kann sich sehen lassen ;)

    Danke nochmal!
    Gruß
    Mike