Doppeltes Umbenennen
Tobi
- perl
Hallo Forum
Ich habe malwieder ein Problemchen mit meinem HTML Chat (immer noch
nicht online). Ich versuche mit dem Code unten eine Art
Passwortmöglichkeit zu bieten. D.h. es soll nicht möglich sein einen
geschützten Namen anzuwählen, wenn man das versucht soll Blödel
erscheinen. Wenn man jetzt der Namensinhaber ist gibt man das
entsprechende Passwort ein (123qwe ewq321) und der Name wird Tobi
(o.ä.). Mein Problem ist nun, das der Name sich von 123qwe gleich in
Blödel verwandelt, weils halt leider nicht zeilenweise interpretiert
wird. Wie kann ich das doppelte umbenennen verhindern?
Mein Code:
----schnipp----
if($dat{'homepage'} eq "" "keine" "no") {
$dat{'homepage'} = "http://www.tobi-beck.de"
}
if($dat{'name'} ne "Tobi" "Vitrex" "Tobias" "123qwe" "ewq321") {
$dat{'name'} = $dat{'name'}
}
if($dat{'name'} eq "Tobi" "Vitrex" ) {
$dat{'name'} = "Blödel"
}
if($dat{'name'} eq "123qwe" ) {
$dat{'name'} = "Tobi"
}
if($dat{'name'} eq "ewq321" ) {
$dat{'name'} = "Vitrex"
}
----schnapp----
Vielen Dank im Voraus
Tobi
Hi,
»» if($dat{'name'} ne "Tobi" "Vitrex" "Tobias" "123qwe" "ewq321") {
$dat{'name'} = $dat{'name'}
}
das ist schon mal ziemlich sinnfrei: Unter bestimmten Bedingungen wird $dat{'name'} auf sich selbst gesetzt, unter allen anderen bleibt es wie es ist. Ersatzlose Streichung ist mein Vorschlag.
»» if($dat{'name'} eq "Tobi" "Vitrex" ) {
$dat{'name'} = "Blödel"
}
elsif($dat{'name'} eq "123qwe" ) {
$dat{'name'} = "Tobi"
}
elsif($dat{'name'} eq "ewq321" ) {
$dat{'name'} = "Vitrex"
}
else { $dat{'name'} = "Blödel"; } # vermute ich
Die "elsif" sind es, die Du suchst.
Ein allgemeiner Tip übrigens: Um Perl zu lernen ist SelfHTML eher schäd- als nützlich. Halte Dich an perldoc auf Deiner Festplatte.
Cheatah
Hi,
»» if($dat{'name'} ne "Tobi" "Vitrex" "Tobias" "123qwe" "ewq321") {
$dat{'name'} = $dat{'name'}
}das ist schon mal ziemlich sinnfrei: Unter bestimmten Bedingungen wird $dat{'name'} auf sich selbst gesetzt, unter allen anderen bleibt es wie es ist. Ersatzlose Streichung ist mein Vorschlag.
ups, hehe klar aber beim vielen hin und herprobieren kann sowas schon mal stehen bleiben, ich werde mich bessern ;)
»» if($dat{'name'} eq "Tobi" "Vitrex" ) {
$dat{'name'} = "Blödel"
}
elsif($dat{'name'} eq "123qwe" ) {
$dat{'name'} = "Tobi"
}
elsif($dat{'name'} eq "ewq321" ) {
$dat{'name'} = "Vitrex"
}else { $dat{'name'} = "Blödel"; } # vermute ich
Die "elsif" sind es, die Du suchst.
Mmmh aber dann ist ja $dat('name') in jedem Fall (außer bei Passwort) Blödel. Ich will erreichen, dass nur bei Ersteingabe Tobi der Name Blödel erscheint.
Verstehst du (oder der rest der Welt ;)
Nochmal Danke im Voraus Tobi
Ein allgemeiner Tip übrigens: Um Perl zu lernen ist SelfHTML eher schäd- als nützlich. Halte Dich an perldoc auf Deiner Festplatte.
Ich habe selfhtml auch weniger für perl, aber das Forum ist doch ein guter Platz oder?
Hi,
»» if($dat{'name'} eq "Tobi" "Vitrex" ) {
$dat{'name'} = "Blödel"
}
elsif($dat{'name'} eq "123qwe" ) {
$dat{'name'} = "Tobi"
}
elsif($dat{'name'} eq "ewq321" ) {
$dat{'name'} = "Vitrex"
}else { $dat{'name'} = "Blödel"; } # vermute ich
Die "elsif" sind es, die Du suchst.
Mmmh aber dann ist ja $dat('name') in jedem Fall (außer bei Passwort) Blödel. Ich will erreichen, dass nur bei Ersteingabe Tobi der Name Blödel erscheint.
Verstehst du (oder der rest der Welt ;)
nein... was meinst Du mit "Ersteingabe"? Wenn ich das richtig sehe, handelt es sich um ein CGI-Script; da werden sämtliche Parameter gleichzeitig übergeben und sind _nur_ dann vorhanden. So etwas wie eine Erst- oder Zweiteingabe gibt es nicht.
Vielleicht erklärst Du einfach noch mal detailliert, was Du eigentlich auf welche Weise erreichen willst...
Ein allgemeiner Tip übrigens: Um Perl zu lernen ist SelfHTML eher schäd- als nützlich. Halte Dich an perldoc auf Deiner Festplatte.
Ich habe selfhtml auch weniger für perl, aber das Forum ist doch ein guter Platz oder?
Klar, ich wollte nur sichergehen :-) zumal Dein %dat irgendwie so klingt, als würdest Du CGI.pm nicht benutzen.
Cheatah
Hallo,
Vielleicht erklärst Du einfach noch mal detailliert, was Du
eigentlich auf welche Weise erreichen willst...
Also Ich beschreibe mal den Weg der Daten. Es geht los im
Loginbereich, hier Gibt der Nutzer Name, Farbe... an. Diese Eingaben
werden der nächsten Seite übergeben, dort ist eine kleine Begrüßung
(Hallo Name du hast die Farbe...). Dann werden die Daten zum
Chattexteingabeframe übertragen (Da wird Text eingegeben abgeschickt,
eingegeben...).
Ich will: Das bestimmte User (z.B. Tobi) sich am Anfang mit einem
Passwort ins Namensfelt einloggen. Hier 123qwe diese Eingabe soll
später in den wirklichen Namen (Tobi) umgewandelt werden.
elsif($dat{'name'} eq "123qwe" ) {
$dat{'name'} = "Tobi"
}
Außerdem: Wenn sich jetzt ein anderer Chatter mit einem geschützten
Namen anmeldet (z.B. Tobi) soll dieser in Blödel verwandelt werden.
if($dat{'name'} eq "Tobi" "Vitrex" ) {
$dat{'name'} = "Blödel"
}
Und zum Schluß:
Wenn sich ein Chatter mit einem völlig anderen Namen (was weiß ich
Klaus) anmeldet, soll sich nichts verändern.
Das Problem: wenn ich am Anfang 123qwe eingebe erkennt das System
Tobi --> muß geandert werden in Blödel. Das will ich verhindern.
Danke im Voraus Tobi
Hi,
elsif($dat{'name'} eq "123qwe" ) {
^^^ ich vermute, Du hast diese Änderung gar nicht bemerkt... Wenn Du die elsif so benutzt, wie ich es geschrieben habe, müßte es eigentlich gehen.
Cheatah
Hi Cheatah
elsif($dat{'name'} eq "123qwe" ) {
^^^ ich vermute, Du hast diese Änderung gar nicht bemerkt... Wenn Du die elsif so benutzt, wie ich es geschrieben habe, müßte es eigentlich gehen.
if($dat{'name'} eq "Tobi" "Vitrex" ) {
$dat{'name'} = "Blödel"
}
elsif($dat{'name'} eq "123qwe" ) {
$dat{'name'} = "Tobi"
}
elsif($dat{'name'} eq "ewq321" ) {
$dat{'name'} = "Vitrex"
}
else { $dat{'name'} = "Blödel"; } # vermute ich
ich habe es jetzt genau mit diesem Code probiert (und auch ein paar Variationen),
aber das Ergebnis ist leider das sich jetzt alles
egal was in Blödel umbenennt (Klaus, Tobi, 123qwe...)
Ich hoffe es gibt überhaupt eine Lösung...
Ciao Tobi
Hi,
Hi Cheatah,
Hoffe, du bist mir nicht bös, wenn ich dir antworte? *g*
»» if($dat{'name'} eq "Tobi" "Vitrex" ) {
»» $dat{'name'} = "Blödel"
}
elsif($dat{'name'} eq "123qwe" ) {
»» $dat{'name'} = "Tobi"
}
elsif($dat{'name'} eq "ewq321" ) {
»» $dat{'name'} = "Vitrex"
}
else { $dat{'name'} = "Blödel"; } # vermute ich
Soweit ich daß mitbekommen habe, werden immer alle Bedingungen
der Reihe nach abgearbeitet. Das heißt:
ist $dat{'name'} = Tobi oder Vitrex? -> nein
-> ist $dat{'name'} = 123qwe? -> ja -> $dat{'name'} = Tobi
-> ist $dat{'name'} = ewq321? Nein.
So, und hier liegt jetzt das Problem: das else wird immer der nächsten
freien Bedingung zugteilt. Das heißt:
$dat{'name'} ist NICHT ewq321 -> $dat{'name'} = Blödel
mit anderen Worten, man sollte das ganze vielleicht umpacken in
2 Blöcke, die in sich unterteilt sind:
if ($dat{'name'} eq "Tobi" "Vitrex")
{
$dat{'name'} = "Blödel";
} else {
if($dat{'name'} eq "123qwe")
{
$dat{'name'} = "Tobi";
} else {
if ($dat{'name'} eq "123ewq")
{
$dat{'name'} = "Vitrex";
}
}
}
Also: wenn $dat{'name'} = Tobi oder Vitrex, dann
$dat{'name'} = Blödel; wenn nicht:
wenn $dat{'name'} = 123qwe, dann $dat{'name'} = Tobi; wenn nicht:
wenn $dat{'name'} = 123ewq, dann $dat{'name'} = Vitrex.
Ich weiß, ist umständlich, sollte aber funzen *g*
Außerdem würde ich mir überlegen, ob du nicht statt
if ($dat{'name'} eq "Tobi" "Vitrex")
if ($dat{'name'} eq "Tobi" $dat{'name'} eq "Vitrex")
schreibst. Ist zwar länger, aber in allen anderen Sprachen, die ich
kenne, werden die Bedingungen miteinander verknüpft. Ich weiß zwar
nicht, wie das in Perl ist, aber in anderen Sprachen wäre der
zweite Ausdruck (also "Vitrex") immer TRUE, da "Vitrex" größer 0
ist ,) Wie gesagt, ich weiß nicht, ob die Konstruktion oben eine
Eigenart von Perl ist, aber ich würds einfach mal versuchen ,)
Ich hoffe es gibt überhaupt eine Lösung...
Nicht verzweifeln ,) es gibt IMMER eine Lösung ,)
mfg
CK1
P. S.: Die Angaben sind, wie immer, ohne Gewähr *g*
Hi CK1 und natürlich auch Cheatah
vielen Dank für eure Hilfe. so klappt jetzt alles genau
wie ich es immer wollte. <übertreiben>Nächtelanges rumprobieren</übertreiben>
hat endlich ein Ende. Schade nur, dass das ganze jetzt so verrschachtelt ist.
Wenn ich noch mehr Namen schützten will, wird das ein ganz
schönes Gerüst... aber Hauptsache es heißt kaum noch jemand Blödel ;)
Danke Ciao Tobi
Tobi,
Wenn ich noch mehr Namen schützten will, wird das ein ganz
schönes Gerüst... aber Hauptsache es heißt kaum noch jemand Blödel ;)
Probier's doch mit einem Hash:
%pwd-usr = {'123qwe' => 'Tobi',
'Tobi' => 'Blödel',
'ewq321' => 'Vitrex'.
'Vitrex' => 'Blödel',
};
$dat{'name'} = $pwd-usr{ $dat{'name'} };
Je nach Menge der Namen, wird evtl. einfacher, die "Blödel-einen" aus dem Hash herauszulassen und durch das Prg. einsetzen zu lassen:
foreach $user (values %pwd-usr)
{
$pwd-usr{$user} = 'Blödel';
}
Bis denne,
Jörk
Hallo
Da hab ich ja mal einen richtig langen Tread geschafft ;)
Danke für den Hashvorschlag, ich werde es im Hinterkopf behalten
es ist meiner Ansicht nach eine sehr gute Lösung.
Aber jetzt freue ich mich erste einmal ein paar Tage über die neue funktionierende Funftion meines fänomenalen Chats...
Ciao Tobi
Hi,
Außerdem würde ich mir überlegen, ob du nicht statt
if ($dat{'name'} eq "Tobi" "Vitrex")
if ($dat{'name'} eq "Tobi" $dat{'name'} eq "Vitrex")
jepp, ich glaube, daran liegt's - irgendwie hatte ich mich an den Anblick schon gewöhnt, deswegen fiel es mir nicht auf... Asche auf mein Haupt! :-)
Die erste if-Abfrage wird folgendermaßen geklammert:
if ( ($dat{'name'} eq "Tobi") ("Vitrex") )
Bei einer oder-Verknüpfung muß einer der beiden Seiten true sein. Ein String ungleich "" gilt aber als true, d.h. die Bedingung ist immer erfüllt. Ergo wird auch kein els(eif)-Teil ausgeführt.
Die Klammerung ($dat{'name'} eq ("Tobi" "Vitrex")) dürfte übrigens nicht funktionieren, weil dann die beiden Strings oderverknüpft werden und anschließend auf Gleichheit mit $dat{'name'} geprüft wird. Wobei ich mir momentan nicht sicher bin, wie die oder-Verknüpfung dabei reagiert.
Cheatah
Hallo!
Außerdem würde ich mir überlegen, ob du nicht statt
if ($dat{'name'} eq "Tobi" "Vitrex")
if ($dat{'name'} eq "Tobi" $dat{'name'} eq "Vitrex")
jepp, ich glaube, daran liegt's - irgendwie hatte ich mich an den Anblick schon gewöhnt, deswegen fiel es mir nicht auf... Asche auf mein Haupt! :-)
Die erste if-Abfrage wird folgendermaßen geklammert:
if ( ($dat{'name'} eq "Tobi") ("Vitrex") )
;-) Hab' den Thread eben erst gelesen. Und da mußte ich mich doch wundern, daß Du (Cheatah) da nicht drüber gestolpert bist ...
Die Klammerung ($dat{'name'} eq ("Tobi" "Vitrex")) dürfte übrigens nicht funktionieren, weil dann die beiden Strings oderverknüpft werden und anschließend auf Gleichheit mit $dat{'name'} geprüft wird. Wobei ich mir momentan nicht sicher bin, wie die oder-Verknüpfung dabei reagiert.
"Tobi" "Vitrex" => "Tobi"
Sowas läßt sich z.B. einsetzten bei default-Werten von Parametern:
Statt:
if ($param eq '')
{
$param = 'default';
}
oder:
$param = 'default' if $param eq '';
schreibt man einfach:
$param = 'default';
Gruß,
Jörk
Hi,
jepp, ich glaube, daran liegt's - irgendwie hatte ich mich an den Anblick schon gewöhnt, deswegen fiel es mir nicht auf... Asche auf mein Haupt! :-)
;-) Hab' den Thread eben erst gelesen. Und da mußte ich mich doch wundern, daß Du (Cheatah) da nicht drüber gestolpert bist ...
*g* niemand ist vollkommen... ;-)
Die Klammerung ($dat{'name'} eq ("Tobi" "Vitrex")) dürfte übrigens nicht funktionieren, weil dann die beiden Strings oderverknüpft werden und anschließend auf Gleichheit mit $dat{'name'} geprüft wird. Wobei ich mir momentan nicht sicher bin, wie die oder-Verknüpfung dabei reagiert.
"Tobi" "Vitrex" => "Tobi"
Stimmt, danke.
Statt:
if ($param eq '')
{
$param = 'default';
}
oder:
$param = 'default' if $param eq '';
schreibt man einfach:$param = 'default';
Wobei das ja eigentlich die Kurzschreibweise für
$param = $param 'default';
ist und nur aufgrund des Charakters der speziellen if-Abfrage auch zu jener paßt ;-)
Cheatah, wie setzt man hier ein F'up2 poster? ;-)