Perl-Lerner: Warum der eine print so, der andere anders?

Hallo,
in meinem Perl-Script will ich eine Variable einlesen und in der Ergebnisseite wieder unverändert (!) ausgeben durch

print "document.formular.testString.value="$testString";\n";
oder auch
   print "document.formular.testString.value='$testString';\n";

Wenn diese Variable das Zeichen \ enthält, verschwindet dieses in der Ausgabe.
Wenn ich

print $testString;

absetze wird der Wert korrekt mit dem \ ausgegeben.
Sicherlich ein trivialer Anfängerfehler ?

  1. Hi,

    in meinem Perl-Script will ich eine Variable einlesen und in der Ergebnisseite wieder unverändert (!) ausgeben durch

    print "document.formular.testString.value="$testString";\n";

    Sieht nach Javascript aus.

    Wenn diese Variable das Zeichen \ enthält, verschwindet dieses in der Ausgabe.

    Wenn Du in Javascript ein \ im String haben willst, mußt Du \ in den String schreiben, da der \ als Escape-Zeichen dient.

    Ob der Javascript-String von Dir manuell eingetippt wird oder aus der Ausgabe eines Perl-Scripts stammt, ist dabei irrelevant.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hi,

      Ob der Javascript-String von Dir manuell eingetippt wird oder aus der Ausgabe eines Perl-Scripts stammt, ist dabei irrelevant.

      Heißt das, dass ich jede Eingabe auf \ überprüfen muss und wenn vorhanden ersetzen durch \ ?
      Das wäre ja äußerst unschön
      Schönen Fußballabend !

      1. Hi,

        Ob der Javascript-String von Dir manuell eingetippt wird oder aus der Ausgabe eines Perl-Scripts stammt, ist dabei irrelevant.
        Heißt das, dass ich jede Eingabe auf \ überprüfen muss und wenn vorhanden ersetzen durch \ ?

        Natürlich. Du mußt jede Ausgabe mit den für den jeweiligen Ausgabekontext gültigen Escape-Sequenzen versehen.
        Nur die Ersetzung von \ durch \ reicht natürlich nicht, stell Dir vor, der String enthält noch ' oder " ;-)

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        Schreinerei Waechter
        O o ostern ...
        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. Hallo,
          ich würde gerne das Prinzip kennenlernen. Es ist doch (zumindest für
          einen Laien) unlogisch, dass ein eingelesenes Zeichen umgewandelt werden muss, damit es wieder in seiner ursrünglichen Form ausgegeben
          wird !?
          Kann mir das jemand erklären bzw. entspr. Quellen nennen ?

          1. Hallo,
            ich würde gerne das Prinzip kennenlernen. Es ist doch (zumindest für
            einen Laien) unlogisch, dass ein eingelesenes Zeichen umgewandelt werden muss, damit es wieder in seiner ursrünglichen Form ausgegeben
            wird !?
            Kann mir das jemand erklären bzw. entspr. Quellen nennen ?

            .... und ergänzend :

            Gibt es eine Übersicht    a l l    jener Zeichen, die derartig behandelt werden müssen ?

            1. ich würde gerne das Prinzip kennenlernen. Es ist doch (zumindest für
              einen Laien) unlogisch, dass ein eingelesenes Zeichen umgewandelt werden muss, damit es wieder in seiner ursrünglichen Form ausgegeben
              wird !?
              Kann mir das jemand erklären bzw. entspr. Quellen nennen ?

              Im Prinzip geht es nur um Sonderzeichen, die keine Entsprechung in der ASCII Tabelle haben, d.h. alle Zeichen mit einem code kleiner als 32 (Leerzeichen) um diese Zeichen darstellen zu können muss es maskiert werden, dazu wird der Backslash verwendet. Dann kannst du natürlich nicht mehr den Backslash darstellen, da es ein Sonderzeichen einleitet. In Perl nur innerhalb doppelter Anführungszeichen
              print "Test:\n";
              print 'Test:\n';

              Darüber hinaus ist dein anderes Problem die Quoting zeichen - also die Zeichen mit denen du einen String begrenzt. Um diese innerhalb eines Strings darstellen zu können müssen diese auch maskiert werden:

              print "Test:"";
              print 'Test:'';

              Aber:
              print "Test:'";
              print 'Test:"';

              Darüber hinaus gibt es in Perl noch eine Reihe anderer Möglichkeiten

              Auch in selfhtml wird die Maskierung von Zeichneketten behandelthttp://de.selfhtml.org/perl/sprache/zeichenketten.htm#maskierung

              Struppi.

              --
              Javascript ist toll (Perl auch!)
              1. Danke Struppi.

                1. Es wird immer verworrener!

                  In meinem Perl-Script habe ich in einem Formular definiert:
                  print qq ~
                  .....
                  <td><input type="text" name="test" value="aaa&quot;bbb"</td>
                  ......
                  ~

                  Es wird korrekt angezeigt: aaa"bbb

                  Dann habe ich in dem Perl-Script folgende Statements:

                  $test  = "aaa&quot;bbb";
                  bzw.
                     $test  = "aaa&quot;bbb";
                  bzw.
                     $test  = "aaa\bbb";
                  bzw.
                     $test  = "aaa&#34;bbb"

                  print "<script language='JavaScript1.2'>\n";
                     print "<!--\n";
                     print "document.formular.test.value="$test";\n";
                     print "//-->\n";
                     print "</script>\n";

                  Alle vier Varianten funktionieren nicht.

                  Ich weiß nicht mehr wo ich anpacken soll ?
                  Perl-Problem?
                  HTML-Problem ?
                  Javascript-Problem ?
                  oder ein Mix ?

                  Wahrscheinlich keins von oben sondern
                  Mein Problem !

                  1. Dann habe ich in dem Perl-Script folgende Statements:

                    $test  = "aaa&quot;bbb";
                    bzw.
                       $test  = "aaa&quot;bbb";
                    bzw.
                       $test  = "aaa\bbb";
                    bzw.
                       $test  = "aaa&#34;bbb"

                    print "<script language='JavaScript1.2'>\n";
                       print "<!--\n";
                       print "document.formular.test.value="$test";\n";
                       print "//-->\n";
                       print "</script>\n";

                    einfacher wäre das auch mit qq~ ~
                    Ausserdem ist das language Attribut veraltet stattdessen das type Attribut Pflicht.

                    ...

                    Javascript-Problem ?

                    Hast du dir mal die Fehlermeldung angeschaut?

                    Struppi.

                    --
                    Javascript ist toll (Perl auch!)
                    1. Hallo

                      Hast du dir mal die Fehlermeldung angeschaut?

                      Ja, wenn da eine Meldung käme, wäre es vielleicht einfacher. Aber weder am Bildschirm noch im log kommt ein Hinweis.
                      Aber es wird in dem Feld der entsprechende Wert angezeigt:
                      aaa&quot;bbb, bzw.
                      ....
                      bzw. aaa&#34;bbb.
                      Gruß
                      Noch-Perl-Lerner

                      1. Hi,

                        Ja, wenn da eine Meldung käme, wäre es vielleicht einfacher. Aber weder am Bildschirm noch im log kommt ein Hinweis.
                        Aber es wird in dem Feld der entsprechende Wert angezeigt:

                        Innerhalb von Javascript-Strings solltest Du die Javascript-Escape-Sequenzen benutzen, also " statt &#34;.
                        Daß Du den \ und das " dann ggf. im Perlcode nochmal escapen mußt, ist sowieso klar.

                        cu,
                        Andreas

                        --
                        Warum nennt sich Andreas hier MudGuard?
                        Schreinerei Waechter
                        O o ostern ...
                        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                        1. Hallo Andreas,

                          Innerhalb von Javascript-Strings solltest Du die Javascript-Escape-Sequenzen benutzen, also " statt &#34;.

                          Das ist halt für einen krassen Anfänger nicht einfach, zu wissen, wann &#34; oder wann &quot; oder ". Noch schlimmer wird es  ==> s.u.

                          Daß Du den \ und das " dann ggf. im Perlcode nochmal escapen mußt, ist sowieso klar.

                          Klar ist das einem Anfänger sicher nicht. Insbesondere die Folge von Escape-Zeichen.

                          Heisst dies, ich muss im Perl-Code schreiben ?
                                    \"

                          Ja das heisst es! Ich habe es probiert.
                          Danke.

                          1. Hallo,
                            ich nehme an, das folgende Problem gehört zu dem bisherigen Thema
                            "Escape-Sequenzen", sonst bitte melden, dann poste ich es neu unter anderem Thema !?

                            Wie muss ich den beim Einlesen von Variablen vorgehen, damit ich alles bekomme ?
                            Wenn ich im folgenden Beispiel im Eingabefeld die Folge  a<bbb>c
                            habe, verschluckt das System den Teil <bbb>
                            Woran legt das?

                            Beispiel:
                            <code>
                            #!/usr/bin/perl -w
                            use strict;
                            print "Content-type: text/html\n\n";
                            use vars qw($test ........);
                            use CGI qw/:standard/;
                            use CGI::Carp qw(fatalsToBrowser);

                            ....
                               $test      = param('test');
                            print "test: $test";
                            ....
                            </code>

                            Bitte Lösung möglichst nicht mit dem Vorschlag
                            ...
                            $test = $cgi->param('test')

                            mit dieser Notation komme ich überhaupt nicht zurecht !
                            Danke.

                            1. Hell-O!

                              Wie muss ich den beim Einlesen von Variablen vorgehen, damit ich alles bekomme ?

                              Du bekommst alles :-)

                              Wenn ich im folgenden Beispiel im Eingabefeld die Folge  a<bbb>c habe, verschluckt das System den Teil <bbb>. Woran legt das?

                              Hieran:

                              print "Content-type: text/html\n\n";
                              [...]
                              print "test: $test";

                              Dein String wird als HTML interpretiert mit der Folge, dass alles in spitzen Klammern vom Browser als HTML-Tag umgesetzt und nicht angezeigt wird. Entweder du entschärfst die Klammern durch &lt; ("<") und &gt; (">") oder legst für die Ausgabe den Inhaltstyp "text/plain" o.ä. fest. Btw, schau mal in die Quelltextansicht, da steht dein "<bbb>" mit Sicherheit drin.

                              $test = $cgi->param('test')
                              mit dieser Notation komme ich überhaupt nicht zurecht !

                              Oh, warum das denn?

                              Siechfred

                              --
                              Hier könnte Ihre Werbung stehen.
                              Empirik oder: Verfluchte Nadeldrucker || Die neue 1%-Regelung
                            2. Wenn ich im folgenden Beispiel im Eingabefeld die Folge  a<bbb>c
                              habe, verschluckt das System den Teil <bbb>
                              Woran legt das?

                              Ergänzend zu Siechfred.
                              Es gibt in dem Modul:

                              use CGI qw/:standard/;

                              eine Funktion dafür.

                              Bitte Lösung möglichst nicht mit dem Vorschlag
                              ...
                              $test = $cgi->param('test')

                              mit dieser Notation komme ich überhaupt nicht zurecht !

                              Ich benutze immer die folgene Notation:

                              print CGI::escapeHTML( $test );

                              Struppi.

                              --
                              Javascript ist toll (Perl auch!)
                              1. Au weia !
                                Was man alles denken/wissen muss !

                                $test = $cgi->param('test')
                                mit dieser Notation komme ich überhaupt nicht zurecht !

                                Oh, warum das denn?

                                Da fehlt mir noch viel zu viel Verständnis. Und bis ich mich da
                                eingearbeitet habe, gibt es wahrscheinlich PERL schon gar nicht mehr.
                                Ich habe einmal versucht ein vorhandenes Script dahingehend zu ändern.
                                War aber nur ein Herumprobieren/Herumstochern.

                                An alle Unterstützer ein großes Dankeschön.
                                Ohne dieses Forum und Euch hätte ich schon längst das Handtuch
                                geworfen. Ich hoffe, dass ich Euch weiterhin belästigen darf !?
                                Gruß
                                der wieder optimistische Perl-Lerner

                                1. Hell-O!

                                  Als Einstieg empfiehlt sich das SELFHTML-Kapitel zum Objektorientierten Programmieren.

                                  $test = $cgi->param('test')

                                  Ist doch ganz einfach:
                                  Weise der Variablen $test das Ergebnis der Methode param des CGI-Objektes zu. Benutze dabei die Objektinstanz $cgi und übergib der Methode param den String 'test'.

                                  Und bis ich mich da eingearbeitet habe, gibt es wahrscheinlich PERL schon gar nicht mehr.

                                  Nana, Perl ist mindestens genauso zukunftsträchtig wie PHP :-)

                                  Siechfred

                                  --
                                  Hier könnte Ihre Werbung stehen.
                                  Empirik oder: Verfluchte Nadeldrucker || Die neue 1%-Regelung
                                  1. Als Einstieg empfiehlt sich das SELFHTML-Kapitel zum Objektorientierten Programmieren.

                                    Danke

                                    Den nachfolgenden Satz verstehe ich vielleicht, wenn ich obiges Kapitel verstanden habe.

                                    $test = $cgi->param('test')

                                    Ist doch ganz einfach:
                                    Weise der Variablen $test das Ergebnis der Methode param des CGI-Objektes zu. Benutze dabei die Objektinstanz $cgi und übergib der Methode param den String 'test'.

                                    Im Augenblick klingt für mich der obige Satz wie:
                                    Weise der Variablen $test das Ergebnis der u1 param des u2 zu. Benutze dabei die u3 $cgi und übergib der u1 param den String 'test'.
                                    Gru?
                                    Perl-Lerner

                                    1. $test = $cgi->param('test')

                                      Ist doch ganz einfach:
                                      Weise der Variablen $test das Ergebnis der Methode param des CGI-Objektes zu. Benutze dabei die Objektinstanz $cgi und übergib der Methode param den String 'test'.
                                      Im Augenblick klingt für mich der obige Satz wie:
                                      Weise der Variablen $test das Ergebnis der u1 param des u2 zu. Benutze dabei die u3 $cgi und übergib der u1 param den String 'test'.

                                      Hier liegt evtl. ein Mißverständniss vor (wenn ich deinen Satz richtig deute), param() ist nichts weiter als eine x-beliebige Funktion innerhalb des Paketes CGI.

                                      Du erzeugst eine Instanz von CGI durch $cgi = new CGI; dadurch kann $cgi auf alle Methoden des Paketes zugreifen. $test erhält lediglich den Rückgabewert dieser Funktion.

                                      Mittlerweile finde ich persönlich diese Methode nicht mehr so glücklich. Da du, in einem CGI Programm, die Variabel $cgi, also die Instanz von CGI, überall mit rumschleppen musst oder Global machen musst.
                                      Da man davon ausgehen kann, dass es nur eine einzige Instanz von CGI gibt, bzw. du eigentlich gar keine Instanz brauchst, da du die Funktionen des Moduls auch ohne Objekt benutzen kannst, verwende ich das Modul immer unmittelbar z.b. CGI::param(....)

                                      Das heißt du musst das Modul nur einmal in deinem Hauptskript einbinden mit use CGI; und kannst dann in allen nachgeladenen Modulen auf die Funktionen CGI:: zugreifen. Das hat ausserdem den Vorteil, dass immer siehst welche Funktionen du verwendest, nämlich die aus dem Modul CGI und dir keine Gedanken mehr machen musst, ob die Instanzvariabel überall verfügbar ist.

                                      Also, in dem Falle finde ich den Objektorientierten Ansatz überflüssig.

                                      Gru?

                                      ???

                                      Struppi.

                                      --
                                      Javascript ist toll (Perl auch!)
                                      1. Also, in dem Falle finde ich den Objektorientierten Ansatz überflüssig.

                                        Das beruhigt mich.

                                        Gru?
                                        ???

                                        Sollte Gruß heißen.

                                        Jetzt schaue ich Japan-Brasilien.
                                        Schönen Abend noch.

                      2. Hast du dir mal die Fehlermeldung angeschaut?

                        Ja, wenn da eine Meldung käme, wäre es vielleicht einfacher. Aber weder am Bildschirm noch im log kommt ein Hinweis.

                        Ich meinete eine JS Fehlermeldung. D.h. in der JS Konsole von Firefox z.b.

                        Evtl. kannst du gar nicht auf das Formularfeld zugreifen, weil es noch nicht vorhanden ist, je nachdem wo dein JS Befehl steht.

                        Struppi.

                        --
                        Javascript ist toll (Perl auch!)
  2. Hallo,

    print "document.formular.testString.value="$testString";\n";
    oder auch
       print "document.formular.testString.value='$testString';\n";

    Ich weiß zwar nicht, was du genau vor hast, aber diese Herumbastelei mit Escape-Zeichen ist meine meiner nach nicht besonders sinnvoll.
    Ich würde empfehlen, die Ausgaben in diesem Fall so zu schreiben:

      
    print qq~document.formular.testString.value="$testString"~;  
    
    

    So kannst du den HTML-Code lassen, wie er ist.
    Mit q~...~; und qq~....~; kannst du innerhalb dieser Operatoren beliebigen Text ausgeben, wobei qq auch noch zusätzlich Perl-Variablen parst.

    Markus.

    --
    http://www.apostrophitis.at
    Maschiene währe Standart Gallerie vorraus Packete Objeckte tollerant vieleicht Strucktur