Perl: Key im Hash via Referenz setzen

Dieses Thema im Forum "Ruby, php, Perl, Python ..." wurde erstellt von Tommy_WY, 24.03.2010.

  1. #1 Tommy_WY, 24.03.2010
    Tommy_WY

    Tommy_WY Mitglied

    Dabei seit:
    03.06.2008
    Beiträge:
    28
    Zustimmungen:
    0
    Hallo zusammen,

    ich habe da ein Problem und weiss nicht so recht weiter. Auch selfhtml --> Perl konnte mir nicht so recht weiterhelfen.

    Folgendes Problem.

    Ich setze einen hash mit Key-Value Paaren.
    Jetzt möchte ich einen Value erst später im Programm setzen.
    Wenn ich mir dann die Values später ausgebe, fehlt mir der Value, den ich später setze.
    Beispiel:

    Code:
    #!/usr/bin/perl
    
    %test =	(
    			eins => "eins",
    			zwei => "$was",
    			drei => "drei"
    		);
    $was;
    
    
    printf "Das ist ein Test für hashes!\n";
    $was="sechs";
    print "VALUES test: " , values(%test) , "\n" ;
    
    Wie kann ich den Value setzen? Muss ich mit Referenzen arbeiten? What ever, ich komme nicht weiter und wäre über ein kleines bischen Hilfe oder einen Denkanstoss echt dankbar.

    Grüsse
    Tommy
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 bytepool, 24.03.2010
    Zuletzt bearbeitet: 24.03.2010
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    der Wert von $was wird natuerlich bei der Zuweisung kopiert, ergo kann das nicht funktionieren. Wie du schon richtig erkannt hast, kann man das am besten mit Referenzen machen. Quick & dirty koenntest du z.B. einfach eine Liste mit nur einem Element nehmen. Ich kenne Perl aber selbst nicht allzu gut, das geht sicherlich eleganter.

    Eine weitere Alternative waere eval.

    Edit:
    Nebenbei bin ich persoenlich ein Anhaenger von "use strict;", dadurch fallen eine Reihe von Fehlern eher mal auf, wie auch hier die fehlende Initialisierung von $was.

    mfg,
    bytepool
     
  4. dmaphy

    dmaphy Routinier

    Dabei seit:
    16.04.2004
    Beiträge:
    482
    Zustimmungen:
    0
    Ort:
    Hamburg
    Code:
    $test{'zwei'} = 'wert';
    
    Einzelne Elemente von Hashes mit $ ansprechen, und auf die Schlüssel mit geschweiften Klammern zugreifen. Einmal verinnerlicht ist das ganz einfach. :)
     
  5. ar0

    ar0 Jungspund

    Dabei seit:
    29.03.2010
    Beiträge:
    17
    Zustimmungen:
    0
    Moin,

    @dmaphy: was, wenn das Hash Teil einer Bibliothek ist und die Variable vom User übergeben wird, Stichwort Datenkapselung? perl tk macht das zum Beispiel so.
    Code:
    my $status = '';
    my $status_line = Tk::Label(textvar => \$status);
    
    (aus dem Gedächtnis gecodet, aber der Mechanismus stimmt soweit.)
    Ich würde mal schätzen, dass Tk nicht die einzige Bibliothek ist die das so handhabt.

    @Op: "use strict; use warnings;" kommt an den Anfang *jedes* Perlscripts (ausgenommen CLI 1-liner..). perl ist schon kompliziert genug *mit* strict und warnings, ohne diese Standardmodule wirst du höchstwahrscheinlich >25% deiner Zeit damit verbringen Tipp- und weitere trivial verhinderbare Fehler zu debuggen.
    Btw, wenn dein Beispiel überhaupt funktionieren sollte müsste es
    Code:
    key => $var
    
    im Konstrast zu deinem
    Code:
    key => "$var"
    
    heißen, denn die Doublequotest stringifien die Variable natürlich und du hättest einen konstanten String.
    Aber natürlich funktioniert auch das nicht. Deshalb wie bytepool korrekt bemerkt hat mit Referenzen arbeiten. (Von eval würde ich generell abraten, speziell für eine solch triviale Aufgabe. Nicht nur wegen der Sicherheitsfragen, sondern auch wegen der Performance: für jeden simplen Variablen Zugriff in der Referenzen-Version muss bei eval ein extra perl Interpreter gestartet werden, mit dem entsprechenden verbundenen Overhead.)

    Einführung in Referenzen:
    Code:
    man perlreftut
    oder online bei perldoc.

    perl ohne Referenzen ist fast so schlimm wie c ohne Pointer, man kommt nicht sonderlich weit über hello_world.pl hinaus.
    Noch eine Modul-Empfehlung: wenn du jemals verschachtelte Datenstrukturen ausgeben musst, willst du wahrscheinlich Data::Dumper benutzen.
     
  6. #5 bytepool, 31.03.2010
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    willkommen im Board!

    Danke fuer den Hinweis auf perlreftut, interessante Lektuere. Ich wusste gar nicht dass Referenzen in Perl spezielle Konstrukte sind. Aber das Konzept ist ja hoechst intuitiv, und entspricht dem was man eh unter Referenzen versteht.

    Auf jeden Fall gut zu wissen, mal wieder was gelernt.

    mfg,
    bytepool
     
  7. #6 Tommy_WY, 16.04.2010
    Tommy_WY

    Tommy_WY Mitglied

    Dabei seit:
    03.06.2008
    Beiträge:
    28
    Zustimmungen:
    0
    Sorry,

    ich war ein wenig unpässlich, sprich krank.

    Danke für die Tips, das hat mir sehr geholfen.

    Dafür habe ich jetzt ein anderes Problem, aber das mache ich in einem neuen Fred.

    Grüsse
    Tommy
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

Perl: Key im Hash via Referenz setzen

Die Seite wird geladen...

Perl: Key im Hash via Referenz setzen - Ähnliche Themen

  1. [Perl] Check auf Referenz...Hash

    [Perl] Check auf Referenz...Hash: Hallo! Mal ne kleine Frage. Gibt es ein Funktion mit der ich checken kann, ob in einem Hash der Value eine Referenz auf einen weiter Hash...
  2. Perl: Array von Hashes

    Perl: Array von Hashes: Hallo, ich komme nicht weiter. Ich will in einem Array Hashes speichern und in einer Ausgabefunktion darauf zugreifen. Folgendermaßen bin ich...
  3. perl Hash nach Werten sortieren.

    perl Hash nach Werten sortieren.: Hallo Leute, ich mal wieder:) gibt es eine Möglichkeit in Perl einen Hash nach den Werten absteigend bzw. aufsteigend zu sortieren? mit:...
  4. Perl: Mehrdimensionale Hashs an Unterprogramm übergeben

    Perl: Mehrdimensionale Hashs an Unterprogramm übergeben: Hallo, ich habe folgendes Problem: Ich möchte ein mehrdimensionales Hash der Art ---------- $hash{"gix","gax"} = "..." ---------- als eine...
  5. Linux Foundation: Hyperledger-Projekt startet mit 30 Mitgliedern

    Linux Foundation: Hyperledger-Projekt startet mit 30 Mitgliedern: Das Hyperledger-Projekt der Linux Foundation will eine neue Form der dezentralisierten Kontoführung nach dem Prinzip der »distributed ledger« bei...