Ludewig: Abfrage ob Parameter vorhanden

Hallo,
wie frage ich in Perl sinnvollerweise ab, ob ein Parameter p1 beim Aufruf übergeben wurde? Der Parameter kann einen Wert zugewiesen haben oder nicht.
Die übergebenen Parameter lese ich mit

  
my $query=new cgi;  
my @par=$query->param;  

  1. wie frage ich in Perl sinnvollerweise ab, ob ein Parameter p1 beim Aufruf übergeben wurde? Der Parameter kann einen Wert zugewiesen haben oder nicht.

    http://perldoc.perl.org/CGI.html#FETCHING-THE-VALUE-OR-VALUES-OF-A-SINGLE-NAMED-PARAMETER:

    Struppi.

  2. Hallo,

    Die übergebenen Parameter lese ich mit

    my $query=new cgi;
    my @par=$query->param;

      
    Falls Du das Modul CGI.pm nutzen möchtest, da wird in Groß- und Kleinschreibung unterschieden, wie bei allen Modulen, Symbolen.... in Perl.  
      
    Also:  
    ~~~perl
      
    use strict;  
    use CGI;  
      
    my $q = CGI->new; # new CGI  
      
    # Alle Parameter-Keys:  
    my @keys = $u->param();  
      
    # gezielte Abfrage ob ein Parameter einen Wert liefert  
    if($q->param('foo')){}  
    if(my $foo = $q->param('foo')){}  
      
    # Abfrage, ob ein Parameter existiert  
    if(exists $u->param('bar')){}  
    
    

    ∑: Die Methode param() liefert je nach Kontext ein Scalar oder Array.

    Hotti

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
    1. Hallo,
      erst einmal danke an Euch beide.

      Abfrage, ob ein Parameter existiert

      if(exists $u->param('bar')){}

      Wenn entweder der Parameter "p1" oder "p2" oder keiner vorhanden ist und ich den Namen dieses Parameters einer Variablen $aa zuordnen will,
      so ginge dies ja mit

        
      if(exists $x->param('p1'))  
        {$aa='p1'}  
      elsif(exists $x->param('p2'))  
        {$aa='p2'}  
      else  
        {$aa=''}  
      
      

      Geht es aber noch eleganter?

      1. Wenn entweder der Parameter "p1" oder "p2" oder keiner vorhanden ist und ich den Namen dieses Parameters einer Variablen $aa zuordnen will,
        so ginge dies ja mit

        if(exists $x->param('p1'))

        Wo hast du das denn jetzt her?

        Geht es aber noch eleganter?

        [code lang=perl]my $aa = $x->param('p1') ? 'p1' : $x->param('p2') ? 'p2' : '';

          
        Struppi.
        
        1. Wo hast du das denn jetzt her?

          Geht es aber noch eleganter?

          my $aa = $x->param('p1') ? 'p1' : $x->param('p2') ? 'p2' : '';

          Sieht sehr elegant aus, nur ist $aa immer leer.

          1. Wo hast du das denn jetzt her?

            Geht es aber noch eleganter?

            my $aa = $x->param('p1') ? 'p1' : $x->param('p2') ? 'p2' : '';

            Sieht sehr elegant aus, nur ist $aa immer leer.

            dann machst du etwas falsch.

            Struppi.

          2. Wo hast du das denn jetzt her?

            Geht es aber noch eleganter?

            my $aa = $x->param('p1') ? 'p1' : $x->param('p2') ? 'p2' : '';

            Sieht sehr elegant aus, nur ist $aa immer leer.

            Wenn ich Dein Beispiel richtig verstehe, frägst Du den Inhalt von p1, p2 ab.
            Ich will aber den Namen 'p1' bzw. 'p2' in $aa speichern, wobei p1 und p2 keine Werte besitzen müssen.

            1. Sieht sehr elegant aus, nur ist $aa immer leer.
              Wenn ich Dein Beispiel richtig verstehe, frägst Du den Inhalt von p1, p2 ab.

              Nein, das Skript prüft nur ob die Parameter einen Wert haben, also übertragen wurden.

              Ich will aber den Namen 'p1' bzw. 'p2' in $aa speichern, wobei p1 und p2 keine Werte besitzen müssen.

              Warum willst du das?
              Könntest du etwas präziser werden, wir stochern grad nur in deinen Beschreibung.

              Struppi.

              1. Nein, das Skript prüft nur ob die Parameter einen Wert haben, also übertragen wurden.

                Wieso ist die Tatsache, dass ein Parameter einen Wert hat das Kriterium, das er übertragen wurde?

                Ein Parameter wird doch auch übertragen, wenn ihm kein Wert zugeordnet wurde.
                Meine erste Frage war:
                Wie kann ich abfragen, ob der Parameter existiert (mit oder ohne Wert) - existiert heißt "er wurde übertragen".
                In der Folge habe ich geschrieben, dass ich in der Variable $aa den NAMEN des übertragenen Parameters speichern möchte oder '' falls keiner übertragen wurde.
                Und ich habe ebenfalls geschrieben, dass entweder p1 oder p2 oder keiner übertragen werden.
                Was ist hier nicht klar?

                1. hi,

                  Ein Parameter wird doch auch übertragen, wenn ihm kein Wert zugeordnet wurde.

                  Ja, das ist richtig.

                  Meine erste Frage war:
                  Wie kann ich abfragen, ob der Parameter existiert (mit oder ohne Wert) - existiert heißt "er wurde übertragen".

                  Ok, wenn die Values egal sind....

                    
                  # ersetze y durch a oder b zum Testen  
                  my @params = qw(y b c d e); # $cgi->params(); # liefert Array der Params  
                  my %test = ();              # hier kommen die Parameternamen drauf  
                  @test{@params} = @params;   # hash slice, key = value  
                    
                  my $aa = (exists $test{'a'}) ? $test{a} : (exists $test{x}) ? $test{x} : '';  
                  print $aa;  
                  
                  

                  Was ist hier nicht klar?

                  Alle Klarheiten beseitig ;)
                  Teste mal den Code, bei mir tut er,
                  Hotti

                  --
                  Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
                  1. Hallo

                    Teste mal den Code, bei mir tut er,

                    bei mir auch, danke.
                    Was nicht klappte, war die Version von struppi.
                    Gruß
                    Ludewig

                    1. Hallo

                      bei mir auch, danke.

                      wobei es aber
                      my $aa = (exists $test{'a'}) ? 'a' : (exists $test{x}) ? 'x' : '';
                      heißen muss und nicht
                      my $aa = (exists $test{'a'}) ? $test{a} : (exists $test{x}) ? $test{x} : '';

                      denn ich will ja nicht den Inhalt von a bzw. x sondern den Namen a bzw. x

                      1. wobei es aber
                        my $aa = (exists $test{'a'}) ? 'a' : (exists $test{x}) ? 'x' : '';
                        heißen muss und nicht
                        my $aa = (exists $test{'a'}) ? $test{a} : (exists $test{x}) ? $test{x} : '';

                        denn ich will ja nicht den Inhalt von a bzw. x sondern den Namen a bzw. x

                        Wieder eine Zustazbedingung :-(

                        my $aa = defined $x->param('a') ? 'a' : $x->param('x') || '';

                        Struppi.

                        1. Wieder eine Zustazbedingung :-(

                          Nein auch dies hatte ich geschrieben!
                          Auch Lesen will gekonnt sein!

                      2. hi,

                        wobei es aber
                        my $aa = (exists $test{'a'}) ? 'a' : (exists $test{x}) ? 'x' : '';
                        heißen muss und nicht
                        my $aa = (exists $test{'a'}) ? $test{a} : (exists $test{x}) ? $test{x} : '';

                        Naja, entweder 'fest verdrahten' oder variabel halten.

                        Nochn Hinweis: Evntl. ist auch das Modul use URI::QueryParam; interessant für Dich, falls es nur um Auswertungen von QUERY_STRING geht, z.B. eine Referrer-Analyse.

                        Hotti

                        QueryParam

                    2. hi,

                      Was nicht klappte, war die Version von struppi.

                      Key-Value Missverständnis ;) Sruppis Version fragt nach dem Value.

                      Guck Dir auf jeden Fall mal die Doku zum CGI-Modul an. Herzstück ist die param()-Methode, die liefert ohne namentliche Nennung eines Parameters ein Array mit allen Keys, die im Request gesendet wurden. Wenn Du die Values brauchst (auf einen Key kann es auch mehrere Values geben), muss der Key namentlich an param() übergeben werden.

                      Hotti

                      perldoc CGI

                    3. Was nicht klappte, war die Version von struppi.

                      Natürlich klappt die, nur hast du nicht genau beschrieben was du möchtest.

                      Struppi.

                      1. Was nicht klappte, war die Version von struppi.

                        Natürlich klappt die, nur hast du nicht genau beschrieben was du möchtest.

                        Ja sie tut das, was struppi wollte.
                        Warum muss ein struppi immer Recht haben?
                        Es war von Anfang an von der Existenz des Parameters und nicht seines Wertes die Rede!

                        1. Was nicht klappte, war die Version von struppi.

                          Natürlich klappt die, nur hast du nicht genau beschrieben was du möchtest.

                          Ja sie tut das, was struppi wollte.

                          Genau das was ich verstanden habe, aufgrund deiner Beschreibung und wenn du dann das denkst:

                          Warum muss ein struppi immer Recht haben?

                          Zeigt das lediglich deine Überheblichkeit, die in Anbetracht der Tatsache, dass ich versucht habe deine Frage zu verstehen, um dir zu helfen, reichlich unverschämt ist. Aber es gibt halt immer wieder Menschen die ihren Egoismus über alles andere stellen.

                          Es war von Anfang an von der Existenz des Parameters und nicht seines Wertes die Rede!

                          Joh, und jetzt soll ich mich wohl dafür entschuldigen, dass ich deine Beschreibung nicht so verstanden habe wie du es wolltest?

                          Struppi.

                          1. Es war von Anfang an von der Existenz des Parameters und nicht seines Wertes die Rede!

                            Joh, und jetzt soll ich mich wohl dafür entschuldigen, dass ich deine Beschreibung nicht so verstanden habe wie du es wolltest?

                            Ja, wäre schön, wenn sich der Herr vom hohen Ross begeben würde.
                            Nicht dass Du etwas nicht verstanden hast, sondern wegen der Tatsache, dass für Dich immer die anderen Unrecht haben.
                            Ich habe 5 Kollegen gefragt, wie sie meine Fragen verstehen - keiner hatte sie missverstanden. Diese Umfrage ist natürlich nicht repräsentativ.

                            1. Nicht dass Du etwas nicht verstanden hast, sondern wegen der Tatsache, dass für Dich immer die anderen Unrecht haben.

                              Deine (nicht "die anderen") Aussagen in diesem Thread (woher soll ich Wissen ob du immer unrecht hast?) waren auch falsch. Denn funktionieren tut er Code. Das er nicht macht, was du willst, ist natürlich mein Fehler, was aber deine Arrogantes auftreten nicht rechtfertigt.

                              Aber lassen wir das, du bist der Meinung alles richtig gemacht zu haben, ich habe dir lediglich versucht zu helfen, tut mir leid, wird nicht mehr vorkommen.

                              Struppi.

                2. Nein, das Skript prüft nur ob die Parameter einen Wert haben, also übertragen wurden.

                  Wieso ist die Tatsache, dass ein Parameter einen Wert hat das Kriterium, das er übertragen wurde?

                  Ein Parameter wird doch auch übertragen, wenn ihm kein Wert zugeordnet wurde.

                  Genau deshalb hatte ich nachgefragt. Wenn es dir um einen default Wert geht, dann reicht:

                  my $aa = $x->param('p1') || 'default';

                  Was ist hier nicht klar?

                  Ob es dir um die Existenz des Parameternamens geht oder darum ob ein Wert übertragen wurde.

                  Da es dir um die Existenz des Parameternamens geht, müßte die Abfrage so aussehen:

                  my $aa = defined $x->param('p1') ? $x->param('p1') || 'default' : '';

                  Struppi.

                  1. Hi,

                    Da es dir um die Existenz des Parameternamens geht, müßte die Abfrage so aussehen:

                    Genau so, und ich meine mein erstes Statement
                    "ob ein Parameter p1 beim Aufruf übergeben wurde? Der Parameter kann einen Wert zugewiesen haben oder nicht" sagt genau dies aus.

                    my $aa = defined $x->param('p1') ? $x->param('p1') || 'default' : '';

                    Wenn ich die Perl-Beschreibung richtig verstehe, so ist defined nicht korrekt!
                    Dort steht, wenn ein Parameter existiert, muss er nicht definiert sein - das Umgekehrte gilt nicht.
                    Hottis Vorschlag funktioniert (mit meiner kleinen Änderung).

                    1. Wenn ich die Perl-Beschreibung richtig verstehe, so ist defined nicht korrekt!

                      Doch das ist absolut korrekt - aber lassen wir das ich habe kein weiteres Interesse daran mich mit deinem Problemen zu beschäftigen.

                      Hottis Vorschlag funktioniert (mit meiner kleinen Änderung).

                      Mein Ansatz wäre einfacher, Hottis Vorschlag ist ein unnötiger Umweg mit mehrere kopiervorgängen, wenn dir das lieber ist, soll's mir recht sein.

                      Struppi.

                      1. Wenn ich die Perl-Beschreibung richtig verstehe, so ist defined nicht korrekt!

                        Doch das ist absolut korrekt - aber lassen wir das ich habe kein weiteres Interesse daran mich mit deinem Problemen zu beschäftigen.

                        Nein es ist nicht korrekt - oder die Perl-Doku ist falsch!

                        Hottis Vorschlag funktioniert (mit meiner kleinen Änderung).

                        Mein Ansatz wäre einfacher, Hottis Vorschlag ist ein unnötiger Umweg mit mehrere kopiervorgängen, wenn dir das lieber ist, soll's mir recht sein.

                        Da gebe ich Dir Recht. Sie wäre einfacher, wenn sie das machen würde, was gefordert war.

                        1. Hottis Vorschlag funktioniert (mit meiner kleinen Änderung).

                          Mein Ansatz wäre einfacher, Hottis Vorschlag ist ein unnötiger Umweg mit mehrere kopiervorgängen, wenn dir das lieber ist, soll's mir recht sein.
                          Da gebe ich Dir Recht. Sie wäre einfacher, wenn sie das machen würde, was gefordert war.

                          Das tut sie.
                          http://jstruebig.de/cgi-bin/param.pl
                          http://jstruebig.de/cgi-bin/param.pl?a=

                          Struppi.