Tobi: Doppeltes Umbenennen

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

  1. 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

    1. 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?

      1. 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

        1. 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

          1. 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

            1. 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

              1. 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*

                1. 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

                  1. 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

                    1. 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

                2. 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

                  1. 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

                    1. 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? ;-)