Alain: inputs zählen ,wenn mehr als... -> abruch

Hallo Nabend,
Ich wollte mal fragen wie man die anzahl inputs zählen kann mit perl?
Ein Beispiel:
Ich habe ein formular z.B. mit zwei inputs
<input type="username" name="username" size="15" maxlength="40">
<input type="password" name="password" size="15" maxlength="15">

Im perl steht dies:
my %input = parse_form();
my $username = CGI::param('username')||'';
my $password = CGI::param('password')||'';
bad() unless ($username and $password);

wie kann ich jetzt abragen mit perl ob noch andere inputs bzw. wieviel
inputs folgen?
Grüsse
Alain

  1. Ich habe ein formular z.B. mit zwei inputs
    <input type="username" name="username" size="15" maxlength="40">
    <input type="password" name="password" size="15" maxlength="15">

    Im perl steht dies:
    my %input = parse_form();

    Was ist das denn? CGI.pm macht das automatisch.

    my $username = CGI::param('username')||'';
    my $password = CGI::param('password')||'';
    bad() unless ($username and $password);

    wie kann ich jetzt abragen mit perl ob noch andere inputs bzw. wieviel
    inputs folgen?

    Du bekommst alle Parameter, so wie es in der Dokumentation zum Modul beschrieben ist:

    "FETCHING THE NAMES OF ALL THE PARAMETERS PASSED TO YOUR SCRIPT:

    @names = $query->param

    If the script was invoked with a parameter list (e.g. name1=value1&name2=value2&name3=value3''), the param() method will return the parameter names as a list. If the script was invoked as an <ISINDEX> script and contains a string without ampersands (e.g. value1+value2+value3'') , there will be a single parameter named keywords'' containing the +''-delimited keywords.

    NOTE: As of version 1.5, the array of parameter names returned will be in the same order as they were submitted by the browser. Usually this order is the same as the order in which the parameters are defined in the form (however, this isn't part of the spec, and so isn't guaranteed)."

    Struppi.

    1. hi Struppi,

      Ich habe ein formular z.B. mit zwei inputs
      <input type="username" name="username" size="15" maxlength="40">
      <input type="password" name="password" size="15" maxlength="15">

      Im perl steht dies:
      my %input = parse_form();

      Was ist das denn? CGI.pm macht das automatisch.

      ja ich hatte das parsing in einem sub.
      my %input;
      my $query = new CGI;
      my @names = $query->param;
      foreach (@names){
      $input{$_} = $query->param($_);
      }

      so ok?

      my $username = CGI::param('username')||'';
      my $password = CGI::param('password')||'';
      bad() unless ($username and $password);

      wie kann ich jetzt abragen mit perl ob noch andere inputs bzw. wieviel
      inputs folgen?

      Du bekommst alle Parameter, so wie es in der Dokumentation zum Modul beschrieben ist:

      »»

      so wie ich das jetzt verstanden habe schickt mir das script nur eine liste der inputs zurück?
      wenn ich mir @names anzeigen lasse dann seh ich die namen der inputs vom formular,aber als length @names zeigt es mir nur ne 1
      Möchte aber wissen wieviel @names das formular schickt.

      "FETCHING THE NAMES OF ALL THE PARAMETERS PASSED TO YOUR SCRIPT:

      @names = $query->param

      If the script was invoked with a parameter list (e.g. name1=value1&name2=value2&name3=value3''), the param() method will return the parameter names as a list. If the script was invoked as an <ISINDEX> script and contains a string without ampersands (e.g. value1+value2+value3'') , there will be a single parameter named keywords'' containing the +''-delimited keywords.

      Das heisst also ich kann nicht erfahren ob mehr als nur zwei inputs (name1,name2...) abgeschickt wurden?
      Grüsse vom
      Alain

      1. Was ist das denn? CGI.pm macht das automatisch.

        ja ich hatte das parsing in einem sub.
        my %input;
        my $query = new CGI;
        my @names = $query->param;
        foreach (@names){
        $input{$_} = $query->param($_);
        }

        so ok?

        Das ist doppelt gemoppelt.
        Einmal hält CGI.pm für dich die Werte bereit, die du mit param() benutzen kannst und dann baust du dir nochmal ein HASH mit allen Werten, was u.U. sehr speicherfressend sein kann, da du alles doppelt hast.

        so wie ich das jetzt verstanden habe schickt mir das script nur eine liste der inputs zurück?
        wenn ich mir @names anzeigen lasse dann seh ich die namen der inputs vom formular,aber als length @names zeigt es mir nur ne 1

        Du weißt was length macht?

        BZW. um ganz von vorne anzufangen, du weißt wo du die Dokumentation zu den Perl Funktionen findest?

        Das heisst also ich kann nicht erfahren ob mehr als nur zwei inputs (name1,name2...) abgeschickt wurden?

        Natürlich. Auch wie du die anzahl der Einträge eines array erfährst steht in der Doku, evtl. sogar in der FAQ.

        Struppi.

        1. hi struppi,

          Was ist das denn? CGI.pm macht das automatisch.

          achso,das wusste ich nicht.
          ich habs so ungefähr rausbekommen aber ohne dieses zweite parsen gehts nicht,aber mit gehts
          wenn ich es so abfrage:
          my %input;
          my $query = new CGI;
          my @names = $query->param;
          foreach (@names){
          $input{$_} = $query->param($_);
          }
          my $username = CGI::param('username')||'';
          my $password = CGI::param('password')||'';
          my $array = keys(%input);

          if ($array > 2)
          {
          bad();
          }

          Das ist doppelt gemoppelt.
          Einmal hält CGI.pm für dich die Werte bereit, die du mit param() benutzen kannst und dann baust du dir nochmal ein HASH mit allen Werten, was u.U. sehr speicherfressend sein kann, da du alles doppelt hast.

          wie krieg ich denn den input ohne zweites parsen?

          Du weißt was length macht?

          ja
          ,war wohl falsch ;)
          Gruss
          Alain

        2. hi struppi,

          Das ist doppelt gemoppelt.
          Einmal hält CGI.pm für dich die Werte bereit, die du mit param() benutzen kannst und dann baust du dir nochmal ein HASH mit allen Werten, was u.U. sehr speicherfressend sein kann, da du alles doppelt hast.

          hmmm habs jetzt glaub ich ohne zweimal parsen :)
          Hab nochmals nachgelesen:

          my $username = CGI::param('username')||'';
          my $password = CGI::param('password')||'';
          my $query = new CGI;
          my $names = $query->param||'99';

          bad() unless ($username and $password||$names == 2);

          so ok?
          Grüsse vom
          Alain

          1. hmmm habs jetzt glaub ich ohne zweimal parsen :)
            Hab nochmals nachgelesen:

            my $username = CGI::param('username')||'';
            my $password = CGI::param('password')||'';
            my $query = new CGI;
            my $names = $query->param||'99';

            Das ist auch nicht nötig.

            Die erste Variante CGI zu benutzen, hast du wohl von mir. Ich hab mir angewöhnt einfach direkt auf das Modul zu zugreifen, weil ich sowieso in jedem CGI Programm die CGI.pm eingebunden habe, aber keine Lust hatte immer ein erzeugtes Objekt rum zu schleppen, wo sowieso nur ein CGI Objekt existiert.

            Es geht auch ohne Objekt, also so:

            my $username = CGI::param('username');
            my $password = CGI::param('password');
            my $names = scalar CGI::param();

            bad() if ( !$username || !$password || $names != 2);

            Finde ich verständlicher (falls das ist was du prüfen willst).

            Den Default wert brauchst du in diesem Falle nicht (wir hatten darüber ja mal a länger gesprochen), die Defaultwerte sind nur nötig, wenn du die Eingabe mit einem String vergleichen willst und du vorher nicht prüfst, ob die Werte überhaupt definiert sind.
            Da du hier aber vorher schon prüfst, ob überhaupt was eingegeben wurde ist dies unnötig.

            Struppi.

            1. Hallo Struppi,

              my $username = CGI::param('username')||'';
              my $password = CGI::param('password')||'';
              my $query = new CGI;
              my $names = $query->param||'99';

              Das ist auch nicht nötig.

              Die erste Variante CGI zu benutzen, hast du wohl von mir.

              möglich :)

              Ich hab mir angewöhnt einfach direkt auf das Modul zu zugreifen, weil ich sowieso in jedem CGI Programm die CGI.pm eingebunden habe, aber keine Lust hatte immer ein erzeugtes Objekt rum zu schleppen, wo sowieso nur ein CGI Objekt existiert.

              Es geht auch ohne Objekt, also so:

              my $username = CGI::param('username');
              my $password = CGI::param('password');
              my $names = scalar CGI::param();

              bad() if ( !$username || !$password || $names != 2);

              Finde ich verständlicher (falls das ist was du prüfen willst).

              ja schon, aber die bedingungen müssen alle als ganzes zutreffen,besser wäre dann
              bad() if ( !$username and !$password and $names != 2);

              Den Default wert brauchst du in diesem Falle nicht (wir hatten darüber ja mal a länger gesprochen), die Defaultwerte sind nur nötig, wenn du die Eingabe mit einem String vergleichen willst und du vorher nicht prüfst, ob die Werte überhaupt definiert sind.
              Da du hier aber vorher schon prüfst, ob überhaupt was eingegeben wurde ist dies unnötig.

              Danke -> schönes weekend.
              Grüsse
              Alain

            2. Hallo Struppi,

              hmmm habs jetzt glaub ich ohne zweimal parsen :)
              Hab nochmals nachgelesen:

              my $username = CGI::param('username')||'';
              my $password = CGI::param('password')||'';
              my $query = new CGI;
              my $names = $query->param||'99';

              Das ist auch nicht nötig.

              CGI.pm erstellt im Falle eines direkten Zugriffs von selbst ein
              (internes) Objekt.

              my $names = scalar CGI::param();

              Nicht noetig. Da $names ein Skalar ist, ist der Kontext _kein_
              Listen-Kontext. Da kannst du das scalar auch weglassen.

              Grüße,
               CK

              --
              Nur die Weisesten und die Dümmsten können sich nicht ändern.
              http://wwwtech.de/
              1. Hallo CK,

                my $username = CGI::param('username')||'';
                my $password = CGI::param('password')||'';
                my $query = new CGI;
                my $names = $query->param||'99';

                Das ist auch nicht nötig.

                CGI.pm erstellt im Falle eines direkten Zugriffs von selbst ein
                (internes) Objekt.

                dann wäre also my $names = CGI::param()||'99';
                doch besser anstatt
                my $names = CGI::param();
                weil man dann den vergleich $names != 2 nicht machen kann im zweiten fall,
                da perl dann ein fehler erzeugt "Use of uninitialized value in numeric..."

                my $names = scalar CGI::param();

                Nicht noetig. Da $names ein Skalar ist, ist der Kontext _kein_
                Listen-Kontext. Da kannst du das scalar auch weglassen.

                Grüsse
                Alain

                1. Hallo Alain,

                  mal abgesehen davon, dass du voellig seltsam zitiert hast ;-) ...

                  dann wäre also my $names = CGI::param()||'99';
                  doch besser anstatt
                  my $names = CGI::param();
                  weil man dann den vergleich $names != 2 nicht machen kann im
                  zweiten fall, da perl dann ein fehler erzeugt "Use of
                  uninitialized value in numeric..."

                  ... finde ich das auch sinnvoller so, ja. Ist aber Geschmacksache,
                  muss mal halt, wenn man keinen Default-Wert belegt, mit defined
                  zusaetzlich noch pruefen.

                  Grüße,
                   CK

                  --
                  Sobald dir ein Gedanke kommt, lache über ihn.
                  http://wwwtech.de/