W2k und NT4.0
Matthias Diekhaus
- perl
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
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
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
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
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 !
- Die Zeile "use strict;" einfügen, gleich nach #!perl
- Fehler beseitigen, die nach "use strict;" gemeldet werden, da dürften einige zusammenkommen.
- File::Find statt globbing benutzen, das funktioniert auf jeden Fall.
Alexander