Warum der eine print so, der andere anders?
Perl-Lerner
- perl
0 MudGuard
0 Perl-Lerner0 MudGuard
0 *Markus
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 ?
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
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 !
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
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 ?
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 ?
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.
Danke Struppi.
Es wird immer verworrener!
In meinem Perl-Script habe ich in einem Formular definiert:
print qq ~
.....
<td><input type="text" name="test" value="aaa"bbb"</td>
......
~
Es wird korrekt angezeigt: aaa"bbb
Dann habe ich in dem Perl-Script folgende Statements:
$test = "aaa"bbb";
bzw.
$test = "aaa"bbb";
bzw.
$test = "aaa\bbb";
bzw.
$test = "aaa"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 !
Dann habe ich in dem Perl-Script folgende Statements:
$test = "aaa"bbb";
bzw.
$test = "aaa"bbb";
bzw.
$test = "aaa\bbb";
bzw.
$test = "aaa"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.
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"bbb, bzw.
....
bzw. aaa"bbb.
Gruß
Noch-Perl-Lerner
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 ".
Daß Du den \ und das " dann ggf. im Perlcode nochmal escapen mußt, ist sowieso klar.
cu,
Andreas
Hallo Andreas,
Innerhalb von Javascript-Strings solltest Du die Javascript-Escape-Sequenzen benutzen, also " statt ".
Das ist halt für einen krassen Anfänger nicht einfach, zu wissen, wann " oder wann " 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.
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.
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 < ("<") und > (">") 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
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.
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
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
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
$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.
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.
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.
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.