Perl-Lerner: Fehler bei Dateizugriff

Jetzt habe ich so ein einfaches Beispiel hergenommen und doch Probleme !
Perl behauptet dass die Datei geschlossen ist, obwohl ich sie unmittelbar davor öffne.
Wo liegt da mein Denkfehler ?

$tc_datei = testdat.txt;
 $tc_time = time();

if (-e "$tc_datei")
    {                                              # Datei vorhanden
     open ($tc_datei_fh, "$tc_datei");
     @tc_datei_inhalt = <$tc_datei_fh>;
     close ($tc_datei_fh);

if ($tc_datei_inhalt[0] < $tc_time -120)      # mehr als 120 Sekunden vergangen ?
       {                                           # ja - Aktuelle Zeit eintragen
        open ($tc_datei_fh, ">$tc_datei");
        print $tc_datei_fh $tc_time;
        close ($tc_datei_fh);
       }
     else
       {                                           # nein - Fehlermeldung
        HTML_Output(@tbereits_gesendet);
        exit(1);
       }

}
  else
    {                                              # Datei nicht vorhanden
     open ($tc_datei_fh, ">$tc_datei");
     print $tc_datei_fh $tc_time;     # <<< hier  Fehler (line 223)
     close ($tc_datei_fh);
    }

Fehlermeldung im LOG:
print() on closed filehandle $tc_datei_fh at C:/apachefriends/xampp/htdocs/cgi-bin/rtest.pl line 223.

  1. Hallo Perl-Lerner

    *g*

    Jetzt habe ich so ein einfaches Beispiel hergenommen und doch Probleme !
    Perl behauptet dass die Datei geschlossen ist, obwohl ich sie unmittelbar davor öffne.
    Wo liegt da mein Denkfehler ?

    Erstmal solltest du, gerade wenn du anfängst, alle Perlskripte "strict" machen. D.h. use strict verwenden und sinnvollerweise noch use warnings (oder den -w Switch), dann musst du alle Variabeln mit my oder our deklarieren, das ist zwar am Anfang nervig erspart dir aber die Suche nach Tippfehlern und undefinierten Variabeln.

    #!/usr/bin/perl -w
    use strict;

    $tc_datei = testdat.txt;

    Das geht schon mal nicht, was ist

    $tc_time = time();

    Das müßte dann lauten:
    my  $tc_datei = 'testdat.txt';
    my  $tc_time = time();

    if (-e "$tc_datei")

    Hier sind die Anführungszeichen überflüssig.

    {                                              # Datei vorhanden
         open ($tc_datei_fh, "$tc_datei");

    und hier solltest du trotzdem prüfen ob open funktioniert hat:

    open ($tc_datei_fh, "$tc_datei") or die "Kann $tc_datei nicht öffnen, weil: $!";

    und $tc_datei_fh muss mit my deklariert werden.

    @tc_datei_inhalt = <$tc_datei_fh>;

    Da du nur eine Zeile lesen willst, kannst du hier auch einen Skalar verwenden

    close ($tc_datei_fh);

    if ($tc_datei_inhalt[0] < $tc_time -120)      # mehr als 120 Sekunden vergangen ?
           {                                           # ja - Aktuelle Zeit eintragen
            open ($tc_datei_fh, ">$tc_datei");
            print $tc_datei_fh $tc_time;
            close ($tc_datei_fh);
           }
         else
           {                                           # nein - Fehlermeldung
            HTML_Output(@tbereits_gesendet);
            exit(1);
           }

    }
      else
        {                                              # Datei nicht vorhanden
         open ($tc_datei_fh, ">$tc_datei");
         print $tc_datei_fh $tc_time;     # <<< hier  Fehler (line 223)
         close ($tc_datei_fh);
        }

    So könnte das aussehen:

      
    #!/usr/bin/perl -w  
      
    use strict;  
    my  $tc_datei = 'testdat.txt';  
    my  $tc_time = time();  
    if (-e $tc_datei)  
    {                                              # Datei vorhanden  
        open (my $tc_datei_fh, $tc_datei) or die "Kann Datei $tc_datei nicht öffnen, weil: $!";  
        my $tc_datei_inhalt = <$tc_datei_fh>;  
        close ($tc_datei_fh);  
        if ($tc_datei_inhalt < $tc_time -120)      # mehr als 120 Sekunden vergangen ?  
        {                                           # ja - Aktuelle Zeit eintragen  
             open (my $tc_datei_fh, ">$tc_datei") or die "Kann Datei $tc_datei nicht öffnen, weil: $!";  
             print $tc_datei_fh $tc_time;  
             close ($tc_datei_fh);  
        }  
        else  
        {                                           # nein - Fehlermeldung  
             HTML_Output(@tbereits_gesendet);  
             exit(1);  
        }  
    }  
    else  
    {                                              # Datei nicht vorhanden  
        open (my $tc_datei_fh, ">$tc_datei")or die "Kann Datei $tc_datei nicht öffnen, weil: $!";  
        print $tc_datei_fh $tc_time;     # <<< hier  Fehler (line 223)  
        close ($tc_datei_fh);  
    }  
    
    

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. Super !
      Vielen Dank.

    2. Hallo Struppi,
      doch noch eine Frage.

      In Deinem Beispiel gibst Du mehrmals 'my $tc_datei_fh' an.
      Ist das 'my' tatsächlich immer nötig oder nur einmal.
      Und wenn einmal, dann beim statisch erstmaligen Auftritt ?

      Perl-Lerner

      1. doch noch eine Frage.

        In Deinem Beispiel gibst Du mehrmals 'my $tc_datei_fh' an.
        Ist das 'my' tatsächlich immer nötig oder nur einmal.
        Und wenn einmal, dann beim statisch erstmaligen Auftritt ?

        Durch my gilt eine Variabel nur innerhalb eines Blocks, da du alle open Befehle in anderen Blöcken hast, muss entweder in jedem Block die Variabel neu definiert werden oder einmal global.

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. Perl-Lerner Danke ===> Perl-Profi
          Wieder was gelernt !