Mit open (« und @) nicht nur Zeilen lesen sondern auch Variablen!
Martin
- perl
Hallo liebes Forum,
Bin Anfänger in Perl. Nun möchte ich aus einer Datei auslesen. Das habe ich erreicht mit:
open(FILE,"<test.txt");
@lesen=<FILE>;
close(FILE);
Ich kann nun die einzelnen Zeilen mit
$lesen[0]
$lesen[1] usw. in mein Perlprogramm importieren.
Wenn ich nun aber mit dem open Befehl nicht eine Zeile sondern eine Variable aus der test.txt importieren will z.B.:
benutzer=Dirk
Wie kann ich das machen?
Bitte keine Antworten, wie: "Lern erstmal Perl..." usw.
Habe damit leider schlechte Erfahrungen hier im Forum gehabt.
Wie gesagt: Ich bin Anfänger und versuche natürlich so einiges bevor ich hier poste!
Viele liebe Grüße
Martin
Hi Martin,
kannst Du die Frage genauer Formulieren?
Wie sieht der Inhalt der einzulesenden Datei aus und wie möchtest Du das dann weiterbenutzen?
Manfred
Hi Martin,
kannst Du die Frage genauer Formulieren?
Wie sieht der Inhalt der einzulesenden Datei aus und wie möchtest Du das dann weiterbenutzen?Manfred
Vielen Dank, Manfred!
Ich versuche es erstmal mit der Antwort von Klaus, scheint das richtige zu sein!
Viele liebe Grüße
Martin
Wenn ich nun aber mit dem open Befehl nicht eine Zeile sondern eine Variable aus der test.txt importieren will z.B.:
benutzer=Dirk
Wie kann ich das machen?
hallo Martin,
wenn Du das Format der Datei in der Hand hast, und es sieht irgendwie so aus
---------------------
Benutzer=Dirk
Alter=23
Name=Dirk Wasweisichdenschon
---------------------
kannst Du es so machen:
open(IN,"dateiname")
while(<IN>)
{
chomp;
# hier kommt vielleicht noch das entfernen von Kommentaren und unnötiger Leerzeichen rein
my($name,$wert) = split('=',$_,2);
$$name = $wert;
}
close(IN);
print "$Benutzer\n";
print "$Alter\n";
print "$Name\n";
das alles ergibt folgende Ausgabe:
Dirk
23
Dirk Wasweisichdenschon
so, und wenn Du wissen willst, warum das so geht, kauf Dir 'Programmieren in Perl' aus dem O'Reilly-Verlag.-
Schönen Abend noch
Klaus
so, und wenn Du wissen willst, warum das so geht, kauf Dir 'Programmieren in Perl' aus dem O'Reilly-Verlag.-
Schönen Abend noch
Klaus
Vielen Dank für Deine Antwort!
Werde es gleich ausprobieren.
Ich habe mir schon Bücher gekauft, doch eigendlich noch kein einfaches Nachschlagewerk gefunden. Ich gehe eher praktisch an die Sache ran und probiere herum. Viele Sachen funktionieren so auch. Wenn ich jedoch auf ein Problem stoße, möchte ich nicht ein Buch von Anfang an lesen müßen, sondern lieber nachlagen um das Problem zu lösen.
Das ist vieleicht für einige Perlprogrammierer unsinnig und nicht immer verständlich, bin jedoch nicht schlecht damit gefahren. Die gelernten Sachen bleiben, jedenfalls für mich, in Erinnerung.
Nochmals vielen Dank
Martin
Ich habe mir schon Bücher gekauft, doch eigendlich noch kein einfaches Nachschlagewerk gefunden. Ich gehe eher praktisch an die Sache ran und probiere herum. Viele Sachen funktionieren so auch. Wenn ich jedoch auf ein Problem stoße, möchte ich nicht ein Buch von Anfang an lesen müßen, sondern lieber nachlagen um das Problem zu lösen.
Das ist vieleicht für einige Perlprogrammierer unsinnig und nicht immer verständlich, bin jedoch nicht schlecht damit gefahren. Die gelernten Sachen bleiben, jedenfalls für mich, in Erinnerung.
Hallo Martin,
dann ist wahrscheinlich das 'Perl Kochbuch' das geeignete. HIer werden nach Themengebiet geordnet, Lösungen zu verschiedensten Problemstellungen vorgestellt _und_ diskutiert.
Dadurch hat es für mich stets einen Platz neben der Tastatur.
viel Spaß noch beim Programmieren
Klaus
Hallo Klaus und Martin
open(IN,"dateiname")
while(<IN>)
{
chomp;
# hier kommt vielleicht noch das entfernen von Kommentaren und unnötiger Leerzeichen rein
my($name,$wert) = split('=',$_,2);
$$name = $wert;
Das wird so nicht funktionieren, da $$name der Wert der Referenz $name ist und nicht $Benutzer, $Alter oder $Name. Mehr oder weniger diese Aufgabe erfuellen wuerde
eval '$'.$name.'=$wert;';
Dies ist aber ein Sicherheitsrisiko! Wenn in der Textdatei z.B. die Zeile
_; rm -fr /
; $Benutzer=Dirk
steht, sind nach dem Ausfuehren des Scripts so viele Dateien geloescht wie moeglich (UNIX vorausgesetzt).
Sinnvoller waere hier ein Hash, also obige Zeile ersetzen durch
$daten{$name} = $wert;
Den Wert von "Benutzer" z.B. kann man dann ausgeben mit
print $daten{'Benutzer'};
Gruss
Andreas
Hallo Andreas,
Das wird so nicht funktionieren, da $$name der Wert der Referenz $name ist und nicht $Benutzer, $Alter oder $Name. Mehr oder weniger diese Aufgabe erfuellen wuerde
eval '$'.$name.'=$wert;';
'TMTOWTDI'. Wenn in $name 'Benutzer' drinsteht, dann steht nach '$$name = $wert;' in $Benutzer eben der Wert drin.
Dies ist aber ein Sicherheitsrisiko! Wenn in der Textdatei z.B. die Zeile
_;rm -fr /
; $Benutzer=Dirk
Nur wenn ich eval verwende und wenn ich die Textdatei nicht im Griff habe.
Sinnvoller waere hier ein Hash, also obige Zeile ersetzen durch
$daten{$name} = $wert;
sicher sinnvoller, mach ich auch so, aber ... 'TMTOWTDI'.
Grüße
klaus
Hallo Klaus
'TMTOWTDI'. Wenn in $name 'Benutzer' drinsteht, dann steht nach '$$name = $wert;' in $Benutzer eben der Wert drin.
Du hast Recht! Ich hätte deine Version zuerst testen müssen <g>.
Ich war mir sicher, dass Variablen wie $$name nur durch "harte Referenzen" ($name) erzeugt werden können. In der Perl-Doku (http://www.perl.com/pub/doc/manual/html/pod/perlref.html#Symbolic_references) fand ich nun, dass $name auch eine "symbolische Referenz" sein kann.
Aber auch hier muss man die Textdatei im Griff haben, damit nichts schief läuft.
Gruss
Andreas