Perl: Key im Hash via Referenz setzen

T

Tommy_WY

Mitglied
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
 
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
 
Zuletzt bearbeitet:
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. :)
 
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.
 
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
 
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
 

Ähnliche Themen

NagiosGrapher 1.7.1 funktioniert nicht

Probs mit Perl script

Squid nur zum maskieren der eigenen IP, nicht für Webserver auf port 80

CGI laesst sich nicht ausfuehren

OpenVPN Zertifikate

Zurück
Oben