Fehler bei Dateiverarbeitung
Guido
- perl
Hallo,
ich habe ein Problem mit einem ganz 'einfachen' Code:
611: open(MYINCFILE,"$sendeurl/meta.inc") || die "error: $sendeurl/meta.inc";
612: @myinctext=<MYINCFILE>;
613: close(MYINCFILE);
614: print "@myinctext[0]";
Am Bildschirm kommt der Fehler "error: http://www.meine_URL/meta.inc at .... line 611".
Im Log:
Useless use of a constant in void context at .....pl line 611.
readline() on closed filehandle MYINCFILE at .....pl line 612.
Die Datei "http://www.meine_URL/meta.inc" existiert jedoch!
Fragen:
Was bedeutet die Meldung Useless use ....?
Ist dies die Ursache des Fehlers?
gudn tach!
611: open(MYINCFILE,"$sendeurl/meta.inc") || die "error: $sendeurl/meta.inc";
>
> Am Bildschirm kommt der Fehler "error: http://www.meine\_URL/meta.inc at .... line 611".
in der variable $! sollte ein grund dafuer stehen. [perldoc -f open](http://perldoc.perl.org/functions/open.html)
prost
seth
Hallo,
Die Datei "http://www.meine_URL/meta.inc" existiert jedoch!
Dummerweise wird open AFAIK nicht sehr viel mit "http" anfangen können. Sieh dir doch mal das Modul LWP::Simple an.
Markus
Hallo Markus,
Sieh dir doch mal das Modul LWP::Simple an.
Habe ich getan. Als Perl-Anfänger habe ich aber noch etwas Probleme.
Wie binde ich das Simple.pm in mein Programm ein?
In LWP::Simple steht am Anfang:
perl -MLWP::Simple -e 'getprint "http://www.sn.no"'
use LWP::Simple;
Da verstehe ich nur Bahnhof!
Mein Perl-Programm beginnt mit
#!/usr/bin/perl -w
Danach habe ich das
use LWP::Simple;
eingefügt, was aber zum Fehler führt:
Can't locate LWP/Simple.pm in @INC (@INC contains: C:/XAMPP/perl/lib .) at ....
Kannst Du oder jemand anderes mir da noch einmal helfen, ohne dass ich die ganze Perl-Syntax studieren muss?
Mein Perl-Programm beginnt mit
#!/usr/bin/perl -w
Danach habe ich das
use LWP::Simple;
eingefügt, was aber zum Fehler führt:
Can't locate LWP/Simple.pm in @INC (@INC contains: C:/XAMPP/perl/lib .) at ....
Dann ist das Modul bei dir nicht installiert. Was für eine Perl Version benutzt du?
Struppi.
Hallo,
Dann ist das Modul bei dir nicht installiert. Was für eine Perl Version benutzt du?
Wie finde ich das heraus?
Unter den Eigenschaften von perl.exe wird keine Versionsnummer angezeigt.
Ich habe allerdings die Datei simple.pm gefunden unter:
C:/XAMPP/perl/lib/Filter/simple.pm
und
C:/XAMPP/perl/lib/Test/simple.pm
Viele Grüße
Guido
Dann ist das Modul bei dir nicht installiert. Was für eine Perl Version benutzt du?
Wie finde ich das heraus?
Naja, von wo du sie installiert hast, die Frage war wohl etwas mißvrständlich formmuliert.
(Die Version bekommst du so perl -v die ist aber nicht so wichtig)
Unter den Eigenschaften von perl.exe wird keine Versionsnummer angezeigt.
Ich habe allerdings die Datei simple.pm gefunden unter:
C:/XAMPP/perl/lib/Filter/simple.pm
und
C:/XAMPP/perl/lib/Test/simple.pm
Ist das ActiveState Perl?
Hast du ppm Installiert? (einfach mal ppm in einem DOS Fenster eingeben)
Struppi.
Hallo,
Ist das ActiveState Perl?
Schluchz! Du fragst aber Sachen!
Ich habe das Perl vor längerer Zeit mit dem Apache-Server installiert - stur nach Anleitung - aber wie das heißt?
Hast du ppm Installiert? (einfach mal ppm in einem DOS Fenster eingeben)
Also ppm kennt er nicht beim Aufruf im Dos-Fenster.
Gruß
Guido
Schluchz! Du fragst aber Sachen!
Ich habe das Perl vor längerer Zeit mit dem Apache-Server installiert - stur nach Anleitung - aber wie das heißt?
ich weiß jetzt auch nicht wie man das rausfindet.
Hast du ppm Installiert? (einfach mal ppm in einem DOS Fenster eingeben)
Also ppm kennt er nicht beim Aufruf im Dos-Fenster.
das ist schlecht und im perlverzeichnis/bin gibt's auch keine ppm.bat?
Dann kann es schwierig werden.
Du kannst aber auch versuchen das LWP::Simple Modul von Hand zu installieren, wenn es ein reines Perl Modul ist geht das.
Hier ist die Datei http://search.cpan.org/src/GAAS/libwww-perl-5.805/lib/LWP/Simple.pm
und die musst du in einem Ordner mit dem Namen LWP unterhalb deines Skriptes verschieben.
Allerdings ist das Arbeiten mit so einer Perlversion schwierig, ich würde lieber zum ActiveState Perl raten, dann kannst du leicht Module nachinstallieren.
Struppi.
Du kannst aber auch versuchen das LWP::Simple Modul von Hand zu installieren, wenn es ein reines Perl Modul ist geht das.
Nur, wenn es keine internen Abhängigkeiten hat. Für LWP::Simple ist das nicht gegeben. Schau dir mal LWP::Simple::_init_ua() an.
Heutzutage ist es sinnlos, ein derart ausgereiftes Modul ohne Paketmanager installieren zu wollen.
Dann ist das Modul bei dir nicht installiert. Was für eine Perl Version benutzt du?
Wie finde ich das heraus?
Von der Eingabeaufforderung
perl -v
v steht für Version.
Ich habe allerdings die Datei simple.pm gefunden unter:
C:/XAMPP/perl/lib/Filter/simple.pm
und
C:/XAMPP/perl/lib/Test/simple.pm
Die helfen dir nicht weiter. Du brauchst das Modulpaket libwww-perl, auch bekannt unter dem Namen LWP. Darin ist LWP::Simple enthalten.
Soweit ich weiß, ist es in XAMPP nicht oder nur mit erheblichem Aufwand möglich, Module nachzurüsten. Mein Vorschlag: installiere parallel eine zweite Perldistribution, z.B. Activestate Perl oder Vanilla Perl. Dort kannst du mit den Werkzeugen ppm bzw. cpan Module installieren. Dann musst du Apache beibringen, die neue Distro zu benutzen. Die alte von XAMPP kannst du dann ignorieren.
Habe Acticestate Perl installiert.
Dann musst du Apache beibringen, die neue Distro zu benutzen. Die alte von XAMPP kannst du dann ignorieren.
Weiß jemand, wie man dies anstellt?
Danke
Guido
Siehe http://httpd.apache.org/docs/2.2/de/mod/core.html#scriptinterpretersource.
Die Umgebungsvariable PATH muss auch noch so angepasst werden, dass das bin-Verzeichnis von Activestate Perl vor dem von XAMPPs Perl steht.
Hallo alle Helfer,
ich bin begeistert! Es funktioniert lokal und im Internet!
Danke Euch
Hey,
Was bedeutet die Meldung Useless use ....?
http://perldoc.perl.org/perldiag.html#Useless-use-of-%25s-in-void-context
benutze in Zukunft use diagnostics;
an Stelle von use warnings;
, wenn du die Meldungen erklärt haben möchtest.
Ist dies die Ursache des Fehlers?
Nein, die Ursache liegt in der Verwendung des ||
-Operators. Du berechnest einen logischen Ausdruck, aber stellst nichts mit dem erhaltenen Ergebnis an. Normalerweise fängt man das in einer Variable auf oder schreibt es weg. Beispiel:
my $result = $one || $other;
print $one || $other;
In deinem Ausdruck verpufft das Ergebnis in heißer Luft.
$one || $other;
So. Das eigentliche Problem ist, dass du den falschen Operator verwendet hast. Du sollst or
verwenden, der bindet nicht so stark wie ||
(siehe dazu die Rangreihenfolge der Operatoren). Wenn du das nächste Mal mit Dateien arbeitest, halte dich an die Stilregeln und formuliere so:
{
open my $incfile, '<', 'meta.inc' or die "could not open meta.inc for reading: $!";
@myinctext = (<$incfile>);
close $incfile;
};
print $myinctext[0];
Benutze Skalare statt immer global gültiger Filehandle-Bezeichner. Beschränke den Gültigkeitsbereich von Variablen auf das Nötigste. Benutze die 3-Argumente-Form von open
. Benutze or
, um Fehlermeldungen anzuketten. Schreibe genaue und aussagekräftige Fehlermeldungen. Schreibe $!
, um die Betriebssystemfehlermeldung nach einem Systemaufruf wie open zu erhalten. Benutze () um den <>-Operator, um Listenkontext zu erzwingen. Vermeide unnötige Stringifizierung von Einzelausdrücken. Notiere indizierte Listen mit $, nicht @.
Die Stilregeln kannst du nachlesen in http://perldoc.perl.org/perlstyle.html, http://www.ora.de/catalog/pperl3/ und http://www.ora.de/catalog/perlbpger/.
Hi,
hatte das Beispiel aus Selfhtml genommen.
Und nach dem Tip von *Markus habe ich statt der Angabe "http://...."
die lokale Adresse angegeben. Damit funktioniert es (leider noch nicht in der gewünschten Form).
Gruß
Guido