Martin: Mit open (« und @) nicht nur Zeilen lesen sondern auch Variablen!

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

  1. 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

    1. 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

  2. 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);

    das nur zur Demonstration einer Ausgabe

    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

    1. 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

      1. 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

    2. 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

      1. 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

        1. 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