/(CGI)
agapanthus
- perl
Moin.
Folgendes Problem:
Eine Variable soll mit dem Inhalt eines per Formular übergebenen Feldes gefüllt werden. Ist das Formularfeld leer, soll ein default value eingetragen werden. Dazu prüfe ich in Zeile 12, ob das Feld übermittelt wurde, wenn ja wird die Variable $sizelimit mit dem value beschrieben. Andernfalls ist $sizelimit = 20.
Nun gibt es folgendes Verhalten: Ist das Feld mit einer Zahl größer 0 gefüllt, gehts immer in dem if-Zweig - so soll es sein. Ist das Feld leer, gehst in den else-Zweig, auch ok. ABER ist das Feld mit einer 0 (Ziffer Null) gefüllt, gehts es auch in den else-Zweig!? Warum? Null ist eine gültige Zahl. Und eben nicht "nichts". Wie bekomme ich den Wert Null in meine Variable $sizelimit?
Danke schon mal für Eure Antworten,
Gruß Frank
1 #!/usr/bin/perl -w
2 use CGI;
3 use CGI::Carp qw(fatalsToBrowser);
4
5 my $sizelimit;
6
7 $query = new CGI;
8
9 print $query->header('text/html');
10 print $query->start_html();
11
12 if ($query->param('sizelimit')) {
13 $sizelimit=$query->param('sizelimit');
14 print "if: $sizelimit";
15 }else{
16 $sizelimit=20;
17 print "else: $sizelimit";
18 }
19
20 $query->delete('sizelimit');
21 print $query->startform(-method => 'GET',
22 -name => 'limit',
23 -action => $query->url
24 );
25
26 print "sizelimit: ";
27 print $query->textfield('sizelimit',$sizelimit,10);
28 print $query->submit(-value=>'submit');
29 print $query->endform();
30
31 print $query->end_html();
Moin.
Sorry, jetzt nochmal mit richtigem Thema ...
Eine Variable soll mit dem Inhalt eines per Formular übergebenen Feldes gefüllt werden. Ist das Formularfeld leer, soll ein default value eingetragen werden. Dazu prüfe ich in Zeile 12, ob das Feld übermittelt wurde, wenn ja wird die Variable $sizelimit mit dem value beschrieben. Andernfalls ist $sizelimit = 20.
Nun gibt es folgendes Verhalten: Ist das Feld mit einer Zahl größer 0 gefüllt, gehts immer in dem if-Zweig - so soll es sein. Ist das Feld leer, gehst in den else-Zweig, auch ok. ABER ist das Feld mit einer 0 (Ziffer Null) gefüllt, gehts es auch in den else-Zweig!? Warum? Null ist eine gültige Zahl. Und eben nicht "nichts". Wie bekomme ich den Wert Null in meine Variable $sizelimit?
Danke schon mal für Eure Antworten,
Gruß Frank
1 #!/usr/bin/perl -w
2 use CGI;
3 use CGI::Carp qw(fatalsToBrowser);
4
5 my $sizelimit;
6
7 $query = new CGI;
8
9 print $query->header('text/html');
10 print $query->start_html();
11
12 if ($query->param('sizelimit')) {
13 $sizelimit=$query->param('sizelimit');
14 print "if: $sizelimit";
15 }else{
16 $sizelimit=20;
17 print "else: $sizelimit";
18 }
19
20 $query->delete('sizelimit');
21 print $query->startform(-method => 'GET',
22 -name => 'limit',
23 -action => $query->url
24 );
25
26 print "sizelimit: ";
27 print $query->textfield('sizelimit',$sizelimit,10);
28 print $query->submit(-value=>'submit');
29 print $query->endform();
30
31 print $query->end_html();
Nun gibt es folgendes Verhalten: Ist das Feld mit einer Zahl größer 0 gefüllt, gehts immer in dem if-Zweig - so soll es sein. Ist das Feld leer, gehst in den else-Zweig, auch ok. ABER ist das Feld mit einer 0 (Ziffer Null) gefüllt, gehts es auch in den else-Zweig!? Warum? Null ist eine gültige Zahl. Und eben nicht "nichts". Wie bekomme ich den Wert Null in meine Variable $sizelimit?
Dazu musst du Wissen, worauf ein if(...) oder while(...) prüft. Und zwar ob der Wert in der Klammer ungleich 0 ist, kein Leerstring oder ein definiertes Objekt.
In deinem Falle ist es 0 also falsch. du willst Wissen, ob der wert definiert ist, also:
if (defined $query->param('sizelimit')) {
$sizelimit=$query->param('sizelimit');
print "if: $sizelimit";
}else{
$sizelimit=20;
print "else: $sizelimit";
}
Struppi.
Moin.
Hmm...
if (defined $query->param('sizelimit')) {
Liefert auch TRUE, wenn das Feld leer ist. Es ist defined, aber leer.
Mit folgendem Code geht es
if ($query->param('sizelimit') ne "") {
$sizelimit=$query->param('sizelimit');
}else{
$sizelimit=20;
}
Ich hab trotzdem noch keine Erklärung, warum
if ($query->param('sizelimit'))
FALSE liefert, wenn der Parameter sizelimit leer ODER mit der Ziffer 0 gefüllt ist, TRUE liefert, wenn eine andere Ziffer oder ein anderes Zeichen im Parameter übergeben wird...?
Gruß Frank
Tag agapanthus.
Ich hab trotzdem noch keine Erklärung, warum
if ($query->param('sizelimit'))
FALSE liefert, wenn der Parameter sizelimit leer ODER mit der Ziffer 0 gefüllt ist, TRUE liefert, wenn eine andere Ziffer oder ein anderes Zeichen im Parameter übergeben wird...?
Perl kennt die Werte "true" oder "false" nicht, es handelt hier kontextabhängig. Für Strings gilt: ist er leer, liefert eine Abfrage im boolschen Kontext "false", ansonsten "true", für Zahlen gilt: ist der Wert 0, liefert eine Abfrage im boolschen Kontext "false", ansonsten "true.
Siechfred
Moin.
Perl kennt die Werte "true" oder "false" nicht, es handelt hier kontextabhängig. Für Strings gilt: ist er leer, liefert eine Abfrage im boolschen Kontext "false", ansonsten "true", für Zahlen gilt: ist der Wert 0, liefert eine Abfrage im boolschen Kontext "false", ansonsten "true.
Ahhh! Alles klar :-) Perl mit seiner kontextbezogenen Interpretation. Spart zwar Sachen wie atoi() bzw, itoa() wie in C, ist aber nicht weniger fehlerträchtig.
Dank an Struppi und Dich.
Dann ist das die/eine Lösung:
length($query->param('sizelimit'))
Oder so:
ord($query->param('sizelimit'))
liefert leerem Feld --> 0, sonst immer einen Wert > 0.
Schönen Tag noch,
Gruß Frank
Ich hab trotzdem noch keine Erklärung, warum
if ($query->param('sizelimit'))
FALSE liefert, wenn der Parameter sizelimit leer ODER mit der Ziffer 0 gefüllt ist, TRUE liefert, wenn eine andere Ziffer oder ein anderes Zeichen im Parameter übergeben wird...?
Weil 0 = false ist
Struppi.
你好 agapanthus,
Hmm...
if (defined $query->param('sizelimit')) {
Liefert auch TRUE, wenn das Feld leer ist. Es ist defined, aber leer.Mit folgendem Code geht es
if ($query->param('sizelimit') ne "") {
$sizelimit=$query->param('sizelimit');
}else{
$sizelimit=20;
}
Du solltest dir darüber klar sein, dass du so warnings produzieren wirst
wg. des Vergleichs mit undefinierten Werten. Nämlich immer dann, wenn das
Feld nicht übermittelt wurde. Eine korrekte Abfrage könnte zum Beispiel so
aussehen:
if(defined $query->param('sizelimit') && length($query->param('sizelimit')) > 0) {
$sizelimit = $query->param('sizelimit');
}
else {
$sizelimit=20;
}
Oder, verkürzt:
$sizelimit = defined $query->param('sizelimit') && length($query->param('sizelimit')) ? $query->param('sizelimit') : 20;
Zu dem Rest haben andere ja schon geschrieben.
再见,
克里斯蒂安
12 if ( defined $query->param('sizelimit')) {
Sollte Dir helfen.