cgi->upload() kein Filehandle ...

17/09/2007 - 20:31 von Ervin Peters | Report spam
Teile eines perl cgi upload scriptes:

Ein Hash speichert die auszuführenden actions des Scriptes:

use strict;
use CGI
my $cgi = new CGI();

[..]

my $actions {
[..],

upload => sub
{
my $ifile = $cgi->upload('newfile');
binmode $ifile;
[..]
},

[..]
}

[..]
$ret = $actions->{$action}();
[..]

Ich wunderte mich warum eine Datei angelegt wurde aber leer blieb.

Das binmode gab dann die Fehlermeldungen das $ifile kein gültiges handle
sei. in den Warnungen stand dann was das ein read auf ein nicht offenes
Filehandle nicht möglich sei.

???

Paralleltest des Uploads mit den einem modifizierten selfhtml-upload
script verwirt. Es funktioniert, die Datei wird erstellt und gefüllt,
binmode gibt keinen Fehler.

Der einzige verbleibende Unterschied war zum Schluß noch die Position des

my $ifile = $cgi->upload('newfile')

Ich zog es aus der Funktion raus in den Rumpf und siehe da, es
funktioniert:

my $cgi = new CGI();
my $ifile = $cgi->upload('newfile');

my $actions {
[..],

upload => sub
{
binmode $ifile;
[..]
},

[..]
}


und siehe da, die Datei wurde an der gewünschten Stelle erzeugt und
gefüllt.

Kann mir das jemand erklàren, warum sich die $cgi->upload('newfile')
Variable, genauer das Filehandle daran, abhàngig vom Abfrageort anders
verhàlt?

ervin
 

Lesen sie die antworten

#1 Christian Winter
18/09/2007 - 07:28 | Warnen spam
Ervin Peters schrieb:
Teile eines perl cgi upload scriptes:

Ein Hash speichert die auszuführenden actions des Scriptes:

use strict;
use CGI
my $cgi = new CGI();

[..]

my $actions > {
[..],

upload => sub
{
my $ifile = $cgi->upload('newfile');
binmode $ifile;
[..]
},

[..]
}

[..]
$ret = $actions->{$action}();
[..]

Ich wunderte mich warum eine Datei angelegt wurde aber leer blieb.

Das binmode gab dann die Fehlermeldungen das $ifile kein gültiges handle
sei. in den Warnungen stand dann was das ein read auf ein nicht offenes
Filehandle nicht möglich sei.

???



Das Problem wàre erst gar nicht aufgetaucht, wenn Du
use strict;
use warnings;
am Kopf Deines Scriptes stehen gehabt hàttest.

Eine mit my() deklarierte Variable ist lokal zu dem umschließenden
Codeblock und ausserhalb davon nicht sichtbar, siehe auch
"perldoc -f my" und "perldoc perlsub". Das heisst, dass ausserhalb
der anonymen upload-sub keine $ifile-Variable existiert.

Allerdings glaube ich nicht, dass der obige Code einen Fehler
beim binmode()-Aufruf produziert hat.

Paralleltest des Uploads mit den einem modifizierten selfhtml-upload
script verwirt. Es funktioniert, die Datei wird erstellt und gefüllt,
binmode gibt keinen Fehler.

Der einzige verbleibende Unterschied war zum Schluß noch die Position des

my $ifile = $cgi->upload('newfile')

Ich zog es aus der Funktion raus in den Rumpf und siehe da, es
funktioniert:

my $cgi = new CGI();
my $ifile = $cgi->upload('newfile');

my $actions > {



Ja, denn hier wird $ifile im Kontext des kompletten scripts
definiert. Es würde demzufolge auch reichen, dort nur
my $ifile;
zu schreiben und die Zuweisung selbst in der sub zu belassen.

HTH
-Christian

Ähnliche fragen