Matthias Diekhaus: W2k und NT4.0

Hi

Ich hatte hier schon einmal meinen Fehler gepostet, nur leider ohne Fehlermeldung.
Also meine Fehlermeldung lautet:

read on closed filehandle <_GEN_0> at line 14

mein script:

#!/usr/local/bin/perl -w
#sucht in verschiedenen .osd Dateien nach der
#installierten Version und dem Namen des Packages

#Hauptprogramm

$path = "packages";
verzeichnis_oeffnen();
foreach $file (@verzeichnisse)
{
 datei_oeffnen();
}
datei_schreiben();

#Subroutinen

sub datei_oeffnen #öffnet jede .osd datei im verzichnis und schreibt den inhalt in einen array
{
 $path = "packages/$file";
 @fileliste = <$path/*.osd>;
 foreach $file (@fileliste)
 {
  open(DATEI, $file) || die "Kann die Datei $file nicht oeffnen";
  @datei_inhalt=<DATEI>;
  durchsuchen_name_version();
  $b++;
  $inhalt[$b] = "$name\t";
  $b++;
  $inhalt[$b] = "$version\n";
  close(DATEI);
 }
}

sub durchsuchen_name_version #durchsucht die datei nach den beiden strings, gibt version und name zurück
{
 foreach $zeile (@datei_inhalt)
 {
  $treffername=index($zeile,"NAME");
  $trefferversion=index($zeile,"VERSION");
  if (($treffername != -1) && ($trefferversion != -1))
  {
   @splitten = split (/"/, $zeile);
   $name = $splitten[1];
   $version = $splitten[5];
  }
 }
}

sub verzeichnis_oeffnen #liest das verzeichnis und schreibt den Inhalt in einen Array, gibt den array mit dem verzeichnisinhalt zurück
{
 $i = 0;
 opendir(DIR,"$path") || die "Kann $path nicht oeffnen";
 while($verzeichnis = readdir(DIR))
 {
  $i++;
  $verzeichnisse[$i] = $verzeichnis;
 }
 closedir(DIR);
}

sub datei_schreiben #öffnet log.txt zum schreiben, allerdings nicht zum überschreiben, keine rückgabewert
{
 open (SCHREIBEN, ">> log.txt") || die "kann die datei nicht anlegen";;
 print SCHREIBEN "@inhalt";
 close (SCHREIBEN);
}

Diese Fehlermeldung bekomme ich wie gesagt nur unter NT4.0, unter Win2k bekomme ich sie nicht und es funktioniert.

vielen Dank & Grüße

Matthias Diekhaus

  1. hi,

    kommt mir irgentwie bekannt vor... ich würde mir mal diese Liste hier
    @fileliste = <$path/*.osd>;

    etwas genauer anschauen.

    http://i-netlab.de/hints/fehlerteufel.html

    It means:
    foreach $file(@fileliste){
       print "#$file#\n";
    }

    Möglicherweise ist da ein Leerzeichen oder Tab an $file, die "#" machen das sichtbar.

    Rolf

    1. Hi

      Ist es leider auch nicht, allerdings bekomme ich jetzt die meldung
      Das ein Befehl falsch geschrieben sein sollte. Irgendetwas mit dem Glob Befehl.

      Kann es sein, da auf dem system eine ganz andere Perl version installiert ist, ich auf W2K allerdings mit ActivePerl arbeite, Versions Unterschiede gibt, z.B. dass Module, wie das fürs globbing fehlen. Allerdings benutze ich perl2exe umd die *.pl datei vorher in eine *.exe zu compilieren. Kann das sein, das perl2exe eventuell die Module nicht mit einbezieht.

      Gruß

      Matthias

  2. Moin Moin !

    1. Die Zeile "use strict;" einfügen, gleich nach #!perl
    2. Fehler beseitigen, die nach "use strict;" gemeldet werden, da dürften einige zusammenkommen.
    3. File::Find statt globbing benutzen, das funktioniert auf jeden Fall.

    Alexander

    --
    <!--#include file="signature.html" -->
    1. Hi

      Danke für deinen Tipp. Hab das versucht und es funktioniert einbandfrei, habe nun keinerlei Fehler mehr.
      vielen Dank

      Gruß
      Matthias Diekhaus

      Moin Moin !

      1. Die Zeile "use strict;" einfügen, gleich nach #!perl
      2. Fehler beseitigen, die nach "use strict;" gemeldet werden, da dürften einige zusammenkommen.
      3. File::Find statt globbing benutzen, das funktioniert auf jeden Fall.

      Alexander