programmiertechnik formularauswertung
alex
- perl
0 Slyh0 Slyh
0 Cheatah0 Frank Schönmann0 Cheatah
0 Calocybe
0 Stephan Schmid0 alex
HI.
ich habe eine formularseite mit einer auswahlliste("leute") und einem passwortinput("pwd").
ich verarbeite alle daten mit perl:
#########CODE-Schnipsel
use CGI qw(:standard);
my $pwd= param("pwd");
my $person= param("leute");
check();
sub check
{
if ($person=="abc" && $pwd =~"abc") { ok(); } else { error1(); exit; }
if ($person=="def" && $pwd =~"def") { ok(); } else { error1(); exit; }
}
so sieht meine check routine aus, jedoch funzt die nur für "abc" richtig, "def" bekommt immer den error, wieso?
Alle meine versuche das passwort in verbindung mit der person zu bringen schlugen fehl, entweder funzt nur die erste if schleife, oder es funzt alles und auch das leere passwort. wenn ich dies wiederum versucht habe abzufangen funzt auf einmal kein passwort.
kann mir das einer erklären?
Hi,
»» if ($person=="abc" && $pwd =~"abc") { ok(); } else { error1(); exit; }
»» if ($person=="def" && $pwd =~"def") { ok(); } else { error1(); exit; }
Wenn du in Perl Strings vergleichen willst, benutze 'eq' statt '==' und 'ne' statt '!='.
Siehe Perl-Doku.
Gruß,
Slyh
Hi,
Siehe Perl-Doku.
Zum Beispiel hier: http://www.cpan.org/doc/manual/html/pod/perlop.html#Equality_Operators
'==' und '!=' sind für Zahlen. 'eq' und 'ne' sind das entsprechende für Strings.
Gruß,
Slyh
PS: Sorry für das Doppelposting.
Hi,
use CGI qw(:standard);
großes Lob! :-)
my $pwd=
Und gleich noch eins!
param("pwd");
Hm, kleiner Dämpfer. Die Doublequotes sind kostenaufwendig, weil der String darin interpoliert wird. Schreibe lieber param('pwd') mit Singlequotes.
check();
Noch'n Dämpfer: &check(); oder auch ✓
#!/usr/bin/perl -w
use strict;
hätten Dich darauf hingewiesen.
»» if ($person=="abc" && $pwd =~"abc") { ok(); } else { error1(); exit; }
Hoppla, jetzt geht hier aber wirklich einiges durcheinander.
$person=="abc" prüft, ob der Wert der Variablen $person _numerisch_ identisch ist mit dem von 'abc' (auch hier sind Singlequotes angebracht). Wenn in $person (oder 'abc') also nicht zufällig eine Zahl steht, ist dieser Vergleich _immer_ positiv. Schreibe $person eq 'abc'.
$pwd =~ "abc" ist ein Regular Expression Matching. Da Du nicht die Standardsymbole // verwendest (also $pwd =~ /abc/), mußt Du sagen, daß es sich um ein Matching handelt: $pwd =~ m"abc". Ich bin mir aber gar nicht sicher, daß Du wirklich RegExp benutzen willst - auch hier ist vermutlich $pwd eq 'abc' angebracht.
Für &ok; und &error1; gilt das gleiche wie oben für ✓.
so sieht meine check routine aus, jedoch funzt die nur für "abc" richtig, "def" bekommt immer den error, wieso?
Keine Ahnung. Nach meinem Verständnis müßte es schon beim Vorkompilieren einen Fehler geben.
Cheatah
hi!
check();
Noch'n Dämpfer: &check(); oder auch ✓
Für &ok; und &error1; gilt das gleiche wie oben für ✓.
"check();" etc. ohne &-Zeichen ist natürlich seit Perl 5 absolut
korrekt. Sogar "check;" komplett ohne & und Klammern ist zulässig,
sofern die Subroutine bereits _vor_ Verwendung deklariert wurde.
bye, Frank!
Hi,
check();
Noch'n Dämpfer: &check(); oder auch ✓
Für &ok; und &error1; gilt das gleiche wie oben für ✓."check();" etc. ohne &-Zeichen ist natürlich seit Perl 5 absolut
korrekt. Sogar "check;" komplett ohne & und Klammern ist zulässig,
sofern die Subroutine bereits _vor_ Verwendung deklariert wurde.
stimmt natürlich. Nichtsdestotrotz ist es auch eine Frage des Stils, gewisse allgemeingültige Konventionen einzuhalten - die deutliche Erkennbarkeit eigener Funktionen im Gegenssatz zu builtin und durch Module eingebundener zählt IMHO eindeutig dazu.
Die Qualität eines Produktes zeigt sich nicht nur in der rein technischen Präzision, sondern auch in Punkten wie Les- und Wartbarkeit.
Cheatah
Auch Hi!
param("pwd");
Hm, kleiner Dämpfer. Die Doublequotes sind kostenaufwendig, weil der String darin interpoliert wird. Schreibe lieber param('pwd') mit Singlequotes.
Du hast ja echt wenig Vertrauen in die Optimierungsmechanismen von Perl. Natuerlich wird dieser String nicht interpoliert, da steht naemlich nichts zum interpolieren drin.
check();
Noch'n Dämpfer: &check(); oder auch ✓
#!/usr/bin/perl -w
use strict;hätten Dich darauf hingewiesen.
Wie kommst Du darauf? Ich schreibe Funktionsaufrufe immer in der Form Check(); da ist bisher noch nie was gemeldet worden. (Man beachte den grossen Anfangsbuchstaben bei Check, so werden clashes mit builtins vermieden, und man kann trotzdem so schreiben, wie man es von tausend anderen Sprachen her kennt.)
So long
Hallo Alex,
Mit Bedingungen in serie ist das so ne Sache. Denk die Wahrheitwert für die if-Schleifen mal Schritt für Schritt durch. Wenn $person "def" ist dann ist die erste Schleife bereits false und du fliegst mit error & exit aus dem Programm bevor die zweite Schleife überhaupt ausgewertet werden kann.
»»if ($person=="abc" && $pwd =~"abc") { ok(); } else { error1(); exit; }
»»if ($person=="def" && $pwd =~"def") { ok(); } else { error1(); exit; }
Ein Tip:
Lege Benutzername und Passwort in einem Hash. Dann genügt_einen if-Schleife für die Abfrage.
Links:
Hash: <../../tq.htm>
Operatoren: http://www-cgi.cs.cmu.edu/Web/People/rgs/pl-exp-op.html
SolOng
Stephan
HI.
danke für die infos, es läuft jetzt wie folgt
if ($person eq "abc" && $pwd eq "abc") { ok(); } else {
if ($person eq "def" && $pwd eq "def") { ok(); } else {
und weiter ifs gefolgt von weiteren }
danke auch für die syntaxhilfen