roger: Formularfelder(Parameter) von Webseite mit join verändern

Abend,

ich sende vom Browser per Ajax Daten an ein Perl-cgi-Script

  
httpRequest.open("get","../cgi-bin/ajax.cgi"+"?"+zufall+"&meldung1&meldung2&meldung3", true);  

im Perl Script sieht es so aus

  
  
my $q = CGI->new;  
my @Formularfelder = $q->Vars(); #Hash mit Formulardaten fuellen  
  
shift(@Formularfelder); # Zufallszahl entfernen  
my $varliste = join("#",@Formularfelder);

Nun sieht meine $varliste aber so aus:

  
#meldung1##meldung2##meldung3#  

Warum ?? .... habe ich leere Elemente im Array, bzw. wie kann ich dies verhindern.

gruß
     roger

  1. my @Formularfelder = $q->Vars(); #Hash mit Formulardaten fuellen

    Bemerkst du eine Diskrepanz zwischen Kommentar und Statement?

    Warum ?? .... habe ich leere Elemente im Array, bzw. wie kann ich dies verhindern.

    Weil es dem Listenkontext von $q->Vars entspricht!

    mfg Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische
    1. Morgen,

      my @Formularfelder = $q->Vars(); #Hash mit Formulardaten fuellen

      Bemerkst du eine Diskrepanz zwischen Kommentar und Statement?

      Du meinst nicht  "#Hash mit Formulardaten fuellen" sondern
       "#Array mit Formulardaten fuellen"

      Auf die schnelle habe ich ein

      my @array_neu = grep{ $_ ne "";} @Formularfelder;  
      my $varliste = join(',',@array_neu);
      

      dazwischen gesetzt.

      Nochmals meine Frage.
      Gibt es eine Möglichkeit mit JS die Übergabeparameter zum cgi-script so zu beschreiben das im query_string/übegabeparameter ein normales Array und kein Hash ankommt ?

      gruß
           roger

      1. my @Formularfelder = $q->Vars(); #Hash mit Formulardaten fuellen

        Bemerkst du eine Diskrepanz zwischen Kommentar und Statement?

        Du meinst nicht  "#Hash mit Formulardaten fuellen" sondern
        "#Array mit Formulardaten fuellen"

        Auf die schnelle habe ich ein

        my @array_neu = grep{ $_ ne "";} @Formularfelder;

        my $varliste = join(',',@array_neu);

        
        >   
        > dazwischen gesetzt.  
          
        Und was bewirkt das? Du hast dadurch noch lange nicht eine Liste der Feldnamen. Sondern dazwischen hast du eventuell definierte Feldwerte oder gar undef.  
          
        
        > Nochmals meine Frage.  
        > Gibt es eine Möglichkeit mit JS die Übergabeparameter zum cgi-script so zu beschreiben das im query\_string/übegabeparameter ein normales Array und kein Hash ankommt ?  
          
        Nur dann, wenn du den QS selber zusammenbaust.  
        Dann musst du aber auf das CGI Modul als QS Parser verzichten.  
          
        Ein QS sollte aber als eine Liste von Feldname=Feldwert Combos betrachtet werden.  
        Schn die Tatsache, dass du den QS nur mit JS zusammenbauen kannst, sollte zu denken geben.  
          
        Ich kann mir im übrigen nur einen Grund vorstellen, warum du auf $q->Vars zurückgreifst:  
        Du stellst bei einem POST Request einen QS bereit.  
          
        Neuere Versionen des CGI-Moduls kennen jedoch die Methode:  
        url\_param()  
        Zitat:  
        MIXING POST AND URL PARAMETERS  
          
           1. $color = url\_param('color');  
          
        It is possible for a script to receive CGI parameters in the URL as well as in the fill-out form by creating a form that POSTs to a URL containing a query string (a "?" mark followed by arguments). The param() method will always return the contents of the POSTed fill-out form, ignoring the URL's query string. To retrieve URL parameters, call the url\_param() method. Use it in the same way as param(). The main difference is that it allows you to read the parameters, but not set them.  
          
        Under no circumstances will the contents of the URL query string interfere with similarly-named CGI parameters in POSTed forms. If you try to mix a URL query string with a form submitted with the GET method, the results will not be what you expect.  
          
          
        Dein Vorgehen sollte aber sein, einen kanonischen QS zu verwenden.  
          
        Im Scalarkontext hast du Zugriff auf eine Hashreferenz.  
        my $scalar = $q->Vars;  
          
        <http://perldoc.perl.org/CGI.html#FETCHING-THE-PARAMETER-LIST-AS-A-HASH:>  
          
        mfg Beat
        
        -- 
        
        ><o(((°>           ><o(((°>  
        
           <°)))o><                     ><o(((°>o  
        Der Valigator leibt diese Fische
        
        1. Hallo,

          und Puh, jetzt wird es kompliziert.

          Ich hole mal etwas weiter aus.

          Ich habe Webseiten mit Parametern die ich aktualisieren will.
          Dazu nutze ich die "id"
          Mein JS sucht alle "id" mit einer bestimmten Kennung.
          Diese werden in einen String geschrieben und als Parameter dem cgi-Script übergeben.

          ..cgi?name1&name2...

          Es sind also nur "Namen" ohne "Wert" daher ist ein Array mit den "Namen" im Perlscript vollkommen ausreichend. Es gibt auch keine doppelten "Namen", es muss eindeutig sein.
          Es wird auch nie anders werden, also brauche ich hier auch keine Rücksicht nehmen.
          Die "Namen" werden aus den Messgeräten geholt und als "Name" + "Wert" zurückgeliefert. Hier Standardverfahren, damit ich die Daten mit response im JS wieder verteilen kann, bzw. expliziet mittels "Name" darauf zugreifen kann.

          Natürlich möchte ich Standardverfahren benutzen, wenn jedoch "eigene" Sachen besser geeignet oder gar schneller/einfacher/übersichtlicher sind, werde ich es selbst zusammenbauen.
          Natürlcih soll auf die Menge der Daten die an das Perlscript gesendet werden Rücksicht genommen werden, nur das was absolut nötig ist.

          danke
                   roger

          1. ..cgi?name1&name2...

            Es sind also nur "Namen" ohne "Wert" daher ist ein Array mit den "Namen" im Perlscript vollkommen ausreichend. Es gibt auch keine doppelten "Namen", es muss eindeutig sein.

            my @values = CGI::param();

            Die "Namen" werden aus den Messgeräten geholt und als "Name" + "Wert" zurückgeliefert. Hier Standardverfahren, damit ich die Daten mit response im JS wieder verteilen kann, bzw. expliziet mittels "Name" darauf zugreifen kann.

            Das wäre deutlich einfacher, wenn ihr zwischen Name und Wert ein Trenzeichen macht, wie z.b. das Gleichheitszeichen und dann wäre auch die CGI Auswertung wieder einfacher.

            Natürlich möchte ich Standardverfahren benutzen, wenn jedoch "eigene" Sachen besser geeignet oder gar schneller/einfacher/übersichtlicher sind, werde ich es selbst zusammenbauen.

            Ist es aber in deinem Fall nicht.

            Natürlcih soll auf die Menge der Daten die an das Perlscript gesendet werden Rücksicht genommen werden, nur das was absolut nötig ist.

            Ein Gleichheitszeichen pro Wertepaar sollte aber verkraftbar sein?

            Struppi.

  2. moin,

    Nun sieht meine $varliste aber so aus:

    #meldung1##meldung2##meldung3#

    
    >   
    > Warum ?? .... habe ich leere Elemente im Array, bzw. wie kann ich dies verhindern.  
      
    Du hast einen QS wie folgt: &meldung1&meldung2&meldung3  
    Der Parser von CGI.pm möchte jedoch einen QUERY\_STRING wie folgt  
    ?&meldung1=1&meldung2=2&meldung3=3  
      
    => Key=Value als Paare.  
      
    Btw., ein einfachen hash daraus zu machen heißt Datenverlust, du bekämst mit einer Parameterliste in QS  
      
    &meldung=1&meldung=2&meldung=3  
      
    nämlich ein Array auf den key "meldung". Das ist immer dann der Fall, wenn es mehrere Parameter mit gleichem Namen gibt, bitte also dies beachten und siehe oben: Es sind Paare.  
      
    Freilich kannst Du auch in \_Deiner\_ Parameterliste darauf achten, dass ein Key nur einmal vorkommt, damit verbaust Du dir jedoch etwaige Erweiterungen.  
      
    Alles klar?  
      
    Horst Hauser