Philipp Hasenfratz: Use of uninitialized value in numeric gt (>) at...

Beitrag lesen

Halihallo Alain

if (
      $ENV{'REQUEST_METHOD'} eq 'GET' ||
      !exists($ENV{CONTENT_LENGTH}) ||

!$ENV{CONTENT_LENGTH} geht doch auch ?!

Ja. Bei komplexen Datenstrukturen gibt es beim Abfragen eines nicht
existenten Schlüssels eine autovivication, falls der Schlüssel wiederum auf eine Hash- oder Arrayref zeigen würde. Ich dachte, dass
sich dies mit exists verhindern lässt, was ich gerade versucht habe
und nicht bestätigen konnte.

http://tlc.perlarchive.com/articles/perl/ug0002.shtml

use Data::Dumper;
$t = {};
if ($t->{t}->{z}) {}
print Dumper($t);

$t ist nun { t=>{} }, nicht {}.

ich war dem Irrtum unterlegen, dass ein if (exists $t->{t}->{z})
diese autovivication unterbindet, das war aber ein Irrtum.
In deinem einfachen Beispiel hätte es jedoch sowieso keinen Einfluss
gehabt. Ich wollte nur der formhalber die 100% korrekte
Vorgehensweise verwenden. Und trotz Irrtum ist exists die korrekte
Vorgehensweise, denn du willst ja wissen, ob der Schlüssel existiert
und nicht der Wert, der darin steht (wenn ein Wert existiert, ist
dieser aufgrund des CGI-Standards immer definiert und sei es
nur '0'). Folglich halte ich 'exists' für korrekter, obgleich nicht
besser :-)

Fazit: In deinem Beispiel ist if (!ENV{...}) gleichermassen
vertretbar, wie if (!exists $ENV{...}). Bei komplexen Datenstrukturen
muss man sich hier schon ein zwei Gedanken dazu machen, denn die
autovivication impliziert Speicherverschwendung und bei schlechter
Programmierung sogar sehr viel...

Nun ja, teilweise denke ich zu wenig, teilweise auch viel zu weit :-)

OK, weiter im Text... Sehr restriktiv deine Abfrage, kein Input
grösser als 100 Zeichen erlaubt?

nö kleiner als 100 zeichen erlaubt.Es handelt sich um ein login script mit
begrentzten zeichen für username und passwort.

Hm. OK :-)

Da ich

if ((length $cgi->param('usr_name')) + (length $cgi->param('usr_pwd'))<100) {
...
}

zwar für die korrektere (und CGI angepasste) Methode halte, ist deine
Lösung für das Web-Umfeld und der restriktiven Aufgabenstellung
sicher die performantere.

Du hast einfach ein zwei Probleme:
 - das Script lässt sich nicht per Shell verwenden, was sonst mit
   CGI funktioniert.
 - das Script kann nie über GET verwendet werden (was ja in der
   Aufgabenstellung so durchaus gewollt sein scheint)

was ja aber egal ist. Insofern halte ich deine Lösung für sehr gut.

Viele Grüsse

Philipp

--
M$: Patches - don't.