Perl - Abfrage auf definierte CGI-Variablen
Beate Mielke
- cgi
0 ArneB0 Cheatah0 Calocybe0 Cheatah
0 Michael Schröpl0 Cheatah
Hallo ForumerInnen,
wenn man aus einem Formular Variablen an ein CGI-Script übergibt, die mal einen Inhalt haben können und mal auch nicht, kann man dann in Perl grundsätzlich mit
if (defined (Variable))
nach einem vorhandenen Inhalt abfragen, oder ist das schon im Ansatz falsch?
Beispiel:
die zu übergende Variable heißt "flag"
use strict;
use CGI;
...
my $flag = CGI::param ('flag');
if (defined ($flag)) { ... }
Gruß
Beate Mielke
Hi!
AFAIK würde sogar schon
use strict;
use CGI;
...
my $flag = param('flag');
if ($flag) { ... }
reichen.
Oder einfach if(param("flag")) { ... }.
CU
ArneB
Hi!
AFAIK würde sogar schon
use strict;
use CGI;
...
my $flag = param('flag');
if ($flag) { ... }reichen.
Oder einfach if(param("flag")) { ... }.
Hallo Arne,
kann es sein, dass es sogar falsch ist mit
if (defined ($flag))
abzufragen?
Ich habe immer Fehlermeldungen bezueglich "defined" erhalten.
Mit
if ($flag)
gibt's die Fehlermeldunegn nicht mehr.
Gruß
Beate Mielke
Hi!
kann es sein, dass es sogar falsch ist mit
if (defined ($flag))
abzufragen?
Kann sein. Ich habe noch nie mit defined gearbeitet.
<zitat source="perlfunc">
defined EXPR
defined
Returns a Boolean value telling whether EXPR has a value other than the undefined value undef. If EXPR is not present, $_ will be checked.
</zitat>
Demnach sollte eigentlich auch mit defined gehen.
CU
ArneB
Hallo Beate!
my $flag = param('flag');
if ($flag) { ... }
Kann Probleme geben, wenn der Wert von $flag 0 oder "" ist. Ist dann naemlich auch logisch falsch, der Parameter existiert aber sehr wohl.
Oder einfach if(param("flag")) { ... }.
Ist mit obigem praktisch gleichbedeutend.
kann es sein, dass es sogar falsch ist mit
if (defined ($flag))
abzufragen?
Nein, sollte richtig sein. Zwar ist CGI.pm so schlecht dokumentiert, dass man dort nicht mal findet, was von param() zurueckgeliefert wird, wenn ein abgefragter Parameter nicht existiert, aber ein kleiner Test zeigt, dass es erwartungsgemaess undef ist (also ein undefinierter Skalar). Und das fragst Du ganz richtig mit if (defined(...)) ab.
Ich habe immer Fehlermeldungen bezueglich "defined" erhalten.
Welche?
Bis dann, Roland
Hi,
use CGI;
...
my $flag = CGI::param ('flag');
if (defined ($flag)) { ... }
naja, eine Zeile drüber hast Du $flag definiert... das dürfte also selten false werden :-) Allerdings geht
if (defined CGI::param('flag')) { ... }
Daß Du Dir das "CGI::" sparen kannst, wenn Du "use CGI ':standard';" einbindest, weißt Du?
Cheatah
Hallo Cheatah!
my $flag = CGI::param ('flag');
if (defined ($flag)) { ... }naja, eine Zeile drüber hast Du $flag definiert... das dürfte also selten false werden :-)
Nicht unbedingt. Die Funktion kann undef zurueckgeben. In der Tat wird das regelmaessig eingesetzt, z.B. um eine Fehlersituation zu signalisieren.
Daß Du Dir das "CGI::" sparen kannst, wenn Du "use CGI ':standard';" einbindest, weißt Du?
Schonmal geschaut, was da alles fuer ein Muell in den Namespace von main:: importiert wird? Ein
"use CGI (':cgi')" reicht hier voellig, und selbst das ist schon recht heftig. Immerhin ist das Modul nicht so dreist und verschmutzt den Namespace auch noch ungefragt, wie das z.B. bei LWP::Simple der Fall ist.
So lange, Calocybe
Hi,
naja, eine Zeile drüber hast Du $flag definiert... das dürfte also selten false werden :-)
Nicht unbedingt. Die Funktion kann undef zurueckgeben.
ist mir noch nicht aufgefallen - danke für die Info.
Daß Du Dir das "CGI::" sparen kannst, wenn Du "use CGI ':standard';" einbindest, weißt Du?
Schonmal geschaut, was da alles fuer ein Muell in den Namespace von main:: importiert wird?
Jepp, ist mir bekannt. Üblicherweise nutze ich davon aber auch einen großen Teil, deswegen nenne ich standardmäßig :standard. Wer die importierten Funktionen dann nicht nutzt, hat gewöhnlich eh keine Probleme mit dem Namespace, weil das Script entsprechend kurz ist.
Ein "use CGI (':cgi')" reicht hier voellig,
Wer gepostete Scripts einfach so übernimmt, ohne sie anhand der Doku zu verstehen zu versuchen, tut mir natürlich implizit leid ;-)
Cheatah
Daß Du Dir das "CGI::" sparen kannst, wenn Du "use CGI ':standard';" einbindest, weißt Du?
Ich halte es aber für guten Programmierstil, bei Zugriffen auf Module deren Namen anzugeben, um dem Leser zu dokumentieren, daß der hier verwendete identifier nicht innerhalb des eigenen Programms erfunden, sondern importiert wurde. Und je exotischer das Modul, desto hilfreicher ist die vollständige Notation.
Ich mache das sogar bei meinen eigenen modularisierten Skripten, um mir an jeder Stelle darüber klar zu sein, daß ich mit externen Objekten hantiere.
Hi,
Daß Du Dir das "CGI::" sparen kannst, wenn Du "use CGI ':standard';" einbindest, weißt Du?
Ich halte es aber für guten Programmierstil, bei Zugriffen auf Module deren Namen anzugeben, um dem Leser zu dokumentieren, daß der hier verwendete identifier nicht innerhalb des eigenen Programms erfunden, sondern importiert wurde. Und je exotischer das Modul, desto hilfreicher ist die vollständige Notation.
ACK - allerdings ist Dir hoffentlich bewußt, daß CGI.pm wahrscheinlich das am wenigsten exotische Perl-Modul der Welt ist ;-)
Gerade das "use CGI ':standard';" huscht mir mittlerweile schneller in meine Scripts, als ich merke, daß es gar kein CGI-Script werden soll. Und wenn man die eingebundenen Funktionen dann auch wirklich nutzt (insbesondere die für die HTML-Tags), wird man sich des :standard _sehr_ schnell gewahr, wenn man es nicht benutzt.
Cheatah