unwebify «=» webify
Cruz
- perl
0 AlexBausW0 Cheatah0 Beat Strasser0 Peter Squentz0 Cruz0 Cheatah0 Peter Squentz
Hallo liebe Perl Liebhaber,
Ihr kennt doch bestimmt alle diese Zeile am Anfang eurer Scripts, die die http inputs "unwebify" -t.
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
Wie kann ich das eigentlich umkehren? Also in einem String die Zeichen wieder http comform machen? (webifien hihi)
(eigentlich peinlich, daß ich das nicht weiß, aber da ich diese Zeile immer nur kopiere habe ich es mir noch nie genauer angeguckt)
Gruß
Cruz
Hi Cruz,
Ich bin`s mal wieder ;-)
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
Wie kann ich das eigentlich umkehren? Also in einem String die Zeichen wieder http comform machen? (webifien hihi)
Ich verwende folgendes:
$url =~ s/([^&=+$NotEncode])/sprintf("%%%02X",ord($1))/ego
wobei in $NotEncode weitere Zeichen stehen, die nicht codiert werden sollen.
(eigentlich peinlich, daß ich das nicht weiß, aber da ich diese Zeile immer nur kopiere habe ich es mir noch nie genauer angeguckt)
Muss Dir nicht peinlich sein *verlegenlächelnd*, hab` die Zeile oben selber aus einem "Freeware Modul (CGI-Enurl-1.06)" "entwendet" (*bittenichtverklagenissnurspass*), weil ich eben nur diesen Teil brauchte, und nicht jedesmal das ganze Skript in Anspruch nehmen wollte (die integrierte Dokumentation war mir auch nicht gleich einleuchtend).
Zumindest habe ich verstanden, daß dieses die "Magic Line" sein musste! (Wird auf der angegebenen URL verwendet)
Gruß AlexBausW
P.S.: Vielleicht kann ja jemand mal auflösen was die Zeile macht, oder mir einen Link zu einer ausführlicheren Beschreibung von "sprintf" posten, als es die Doku von Perl hergibt. (Habmir bei der Suche die Finger wundgetippt und einen Wolf geguckt, \*g\*) (Ich hab übrigens
ne Dose, kann also leider net "man sprintf" oder Ähnliches aufrufen) [wird Zeit für‚n neu‚s Maschiensche]
Hi Alex!
Hey vielen Dank auch für diesen Tipp, das sind ja schon 2 in einer Woche. :) Ich habs auf jeden Fall schon mal in meiner Library aufgenommen.
Witziger Weise habe ich aber schon eine andere, wirklich witzige Lösung für das "webifyen" gefunden, und zwar einfach mal die
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
Zeile wegzulassen und nicht unzuwebifyen. *ROFL* Da sucht man und überlegt man und man sieht den einzigen Baum im Wald nicht. Auf einfache Sachen kommt man irgendwie gar nicht mehr in diesen hardcore E-commerce Zeiten. hihi
Leider kann ich dir keinen Link dazu posten, weil das wo ich nachgucken würde ist ein Buch und es liegt auf meinem Schreibtisch im Büro und ist bis Montag morgen nicht zugänglich.
Kann ich übrigens jedem empfehlen...es tut echt gut manchmal in einem Buch anstatt im Internet nachzugucken.
Hi Alex,
P.S.: Vielleicht kann ja jemand mal auflösen was die Zeile macht, oder mir einen Link zu einer ausführlicheren Beschreibung von "sprintf" posten, als es die Doku von Perl hergibt.
habe nachfolgendes in "Programming Perl" von Larry Wall gefunden. Vielleicht hilft es Dir.
Ich habe erst vor kurzem mit Perl angefangen, so daß ich noch nicht bis zu sprintf "vorgedrungen" ;-) bin.
3.2.156 sprintf
sprintf FORMAT, LIST
This function returns a string formatted by the usual printf conventions. The FORMAT string contains text with embedded field specifiers into which the elements of LIST are substituted, one per field. Field specifiers are roughly of the form:
%m.nx
where the m and n are optional sizes whose interpretation depends on the type of field, and x is one of:
Code Meaning
c Character
d Decimal integer
e Exponential format floating-point number
f Fixed point format floating-point number
g Compact format floating-point number
ld Long decimal integer
lo Long octal integer
lu Long unsigned decimal integer
lx Long hexadecimal integer
o Octal integer
s String
u Unsigned decimal integer
x Hexadecimal integer
X Hexadecimal integer with upper-case letters
The various combinations are fully documented in the manpage for printf(3), but we'll mention that m is typically the minimum length of the field (negative for left justified), and n is precision for exponential formats and the maximum length for other formats. Padding is typically done with spaces for strings and zeroes for numbers. The * character as a length specifier is not supported. But, you can easily get around this by including the length expression directly into FORMAT, as in:
$width = 20; $value = sin 1.0;
foreach $precision (0..($width-2)) {
$output_arr[$precision] = sprintf "%${width}.${precision}f", $value;
}
Also, vielleicht hilft es etwas.
Schönes Wochenende
Timoty
Tag!
$url =~ s/([^&=+$NotEncode])/sprintf("%%%02X",ord($1))/ego
P.S.: Vielleicht kann ja jemand mal auflösen was die Zeile macht, oder mir einen Link zu einer
ausführlicheren Beschreibung von "sprintf" posten, als es die Doku von Perl hergibt.
Wieso? Steht doch in der Perldoc ausfuehrlich genug. sprintf gibt einen String zurueck, der aus
So long
Hi Calocybe,
Erst mal vielen Dank für die Aufklärung :-)
Wieso? Steht doch in der Perldoc ausfuehrlich genug.
Ich bin leider mit Active Perl geschlagen. Dort steht in der Doku nur, daß sprintf() sich so verhält wie printf() in C.
Daraufhin hab ich
s dort nachgeschlagen und mir den letzten Teil des Codes leidlich versucht zu erklären (%irgendwas => Ausgabeformat von nachfolgendem Ausdruck) .
sprintf gibt einen String zurueck, der aus
- einem %-Zeichen (%%)
Das war dann der Teil, den ich mir nicht erklären konnte (welch sagenumwobene undokumentierte Geheimwaffe von Perl sich dahinter wohl verbergen konnte ? ;-).
Ist das % also auch zur eigenen Maskierung zu verwenden ?!?
- der hexadezimalen Darstellung des ersten Arguments (%02X <- ord($1))
Jetzt fällt es wie Schuppen aus den Haaren ;-)
besteht. ord($1) ist der Ascii-Code des Zeichens in dezimal, sprintf wandelt ihn zu hex (mit fuehrender 0,
wenn nur einstellig, deshalb 02, nicht nur 2).
Nochmals Danke für die prompte Aufklärung. Das war nämlich der einzige weise Fleck in meinem Code, der nun Farbe bekommen hat ;-)
Gruß AlexBausW
P.S.: An Cruz: Ich generiere damit encoded links auf einer Ausgabeseite, mit denen ich meine Suchmaschine füttern kann.
Hi again
Ich bin leider mit Active Perl geschlagen. Dort steht in der Doku nur, daß sprintf() sich so verhält wie printf() in C.
Weiss nicht, wie aktuell Deine Distri ist, aber bei mir steht da mehr (Build 521). "Wie in C" ist aber mit
Vorsicht zu geniessen, da Perl ja nicht zwischen Zahlen und Strings unterscheidet, da duerfte eine
C-Erklaerung stellenweise ziemlich unlogisch klingen.
- einem %-Zeichen (%%)
Das war dann der Teil, den ich mir nicht erklären konnte (welch sagenumwobene undokumentierte
Geheimwaffe von Perl sich dahinter wohl verbergen konnte ? ;-).
Ist das % also auch zur eigenen Maskierung zu verwenden ?!?
Nur in diesen printf-Formaten. Denn % leitet hier eine "Anweisung" an die (s)printf-Funktion ein, also muss
es auch irgendwie maskiert werden koennen. In normalen Strings hat ja auch \ ne spezielle Bedeutung, also
wird es auch mit sich selbst escaped.
Also gut, auf die Gefahr hin dass das Posting gross wird, kopier ich einfach mal die sprintf-Doku hin, die
bei mir in perlfunc steht:
sprintf FORMAT, LIST
Returns a string formatted by the usual printf() conventions of the C library function sprintf(). See sprintf(3) or printf(3) on your system for an explanation of the general principles.
Perl does its own sprintf() formatting -- it emulates the C function sprintf(), but it doesn't use it (except for floating-point numbers, and even then only the standard modifiers are allowed). As a result, any non-standard extensions in your local sprintf() are not available from Perl.
Perl's sprintf() permits the following universally-known conversions:
%% a percent sign
%c a character with the given number
%s a string
%d a signed integer, in decimal
%u an unsigned integer, in decimal
%o an unsigned integer, in octal
%x an unsigned integer, in hexadecimal
%e a floating-point number, in scientific notation
%f a floating-point number, in fixed decimal notation
%g a floating-point number, in %e or %f notation
In addition, Perl permits the following widely-supported conversions:
%X like %x, but using upper-case letters
%E like %e, but using an upper-case "E"
%G like %g, but with an upper-case "E" (if applicable)
%p a pointer (outputs the Perl value's address in hexadecimal)
%n special: *stores* the number of characters output so far
into the next variable in the parameter list
Finally, for backward (and we do mean ``backward'') compatibility, Perl permits these unnecessary but widely-supported conversions:
%i a synonym for %d
%D a synonym for %ld
%U a synonym for %lu
%O a synonym for %lo
%F a synonym for %f
Perl permits the following universally-known flags between the % and the conversion letter:
space prefix positive number with a space
+ prefix positive number with a plus sign
- left-justify within the field
0 use zeros, not spaces, to right-justify
# prefix non-zero octal with "0", non-zero hex with "0x"
number minimum field width
.number "precision": digits after decimal point for
floating-point, max length for string, minimum length
for integer
l interpret integer as C type "long" or "unsigned long"
h interpret integer as C type "short" or "unsigned short"
There is also one Perl-specific flag:
V interpret integer as Perl's standard integer type
Where a number would appear in the flags, an asterisk (\*'') may be used instead, in which case Perl uses the next item in the parameter list as the given number (that is, as the field width or precision). If a field width obtained through
*'' is negative, it has the same effect as the ``-'' flag: left-justification.
If use locale is in effect, the character used for the decimal point in formatted real numbers is affected by the LC_NUMERIC locale. See perllocale.
So long, Calocybe
Hi Calocybe,
Nochmals Vielen Dank! Hab` Deine Info gleich gespeichert. Ich muß mir wohl doch mal eine neuere Perlversion (incl. Docu) ziehen :-) Bei mir läuft noch Perl 5.003.
Gruß AlexBausW
Hi,
Ihr kennt doch bestimmt alle diese Zeile am Anfang eurer Scripts, die die http inputs "unwebify" -t.
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
kennen? Fürchten! ;-)
Mal ernsthaft: Laß diesen ganzen Quatsch mit der manuellen Parameterumwandlung. Das kann das Modul CGI.pm um einiges besser:
use CGI qw(:standard);
print param('name');
Wie kann ich das eigentlich umkehren?
print CGI::escape($string);
Natürlich gibt es analog dazu CGI::unescape.
Cheatah
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
Wie kann ich das eigentlich umkehren? Also in einem String die Zeichen wieder http comform machen? (webifien hihi)
Dafür gibts doch das Forumsarchiv:
<../../sfarchiv/1999_2/t03778.htm#a18233>
Gruss,
Beat
Hallo Beat
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
Wie kann ich das eigentlich umkehren? Also in einem String die Zeichen wieder http comform machen? (webifien hihi)Dafür gibts doch das Forumsarchiv:
<../../sfarchiv/1999_2/t03778.htm#a18233>
Leider funktioniert diese Lösung nicht 100%-ig. Ein Newline wird z.B. nach %a umgewandelt, da die führende Null entfernt wurde. Ein CGI-Script könnte diese Daten nicht richtig verarbeiten.
Diese Zeilen sollten funktionieren:
$value =~ s/([^ a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
$value =~ tr/ /+/;
Gruss
Andreas
Hallo liebe Perl Liebhaber,
Ihr kennt doch bestimmt alle diese Zeile am Anfang eurer Scripts, die die http inputs "unwebify" -t.
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
Nein, Perl-Liebhaber benutzen so etwas nicht, sondern param aus CGI.pm.
Wie kann ich das eigentlich umkehren? Also in einem String die Zeichen wieder http comform machen? (webifien hihi)
In welchem Zusammenhang moechtest Du das verwenden?
Peter
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
Nein, Perl-Liebhaber benutzen so etwas nicht, sondern param aus CGI.pm.
falsch...Perl liebhaber verzichten soweit es geht auf Module und programmieren alles selbst.
In welchem Zusammenhang moechtest Du das verwenden?
natürlich um einen Query String für andere CGI Scripte zu generieren.
Warum stellst du mir diese Frage, nachdem meine Frage schon mherfach in diesem Thread beantwortet wurde?
Cruz
Hi,
Nein, Perl-Liebhaber benutzen so etwas nicht, sondern param aus CGI.pm.
falsch...Perl liebhaber verzichten soweit es geht auf Module und programmieren alles selbst.
Perl-Liebhaber haben die 00modlist.long.html ganz oben in ihren Bookmarks, oder kennen sie sogar auswendig ;-)
In welchem Zusammenhang moechtest Du das verwenden?
natürlich um einen Query String für andere CGI Scripte zu generieren.
perldoc CGI
Im Grunde brauchst Du Dich um den ganzen Kram überhaupt nicht zu kümmern, wenn Du Dein Script sauber mit Modulen programmierst. Ohne machst Du viel zu viel potentiell falsch. Und in aller Regel nicht nur potentiell.
Cheatah
Hi Cheatah!
Perl-Liebhaber haben die 00modlist.long.html ganz oben in ihren Bookmarks, oder kennen sie sogar auswendig ;-)
Nun, ich denke schon auch, dass man ruhig erstmal schauen kann, ob's denn irgendwo ein Modul fuer das gibt, was man gerade tun will. In Bezug auf die CGI.pm kann ich die Begeisterung aber nicht verstehen. Das Ding ist ein Ungetuem von ueber 6000 Zeilen Code in 190 kB. Das ist oft schon mehr als der halbe Umfang einer ausgewachsenen serverseitigen Applikation. Es kostet schliesslich Zeit, den ganzen Mist jedesmal zu lesen und zu kompilieren. Und wofuer? Um ein bisschen Formdaten zu lesen, was ich mit 5 Zeilen Perl auch kann? Sorry, das kann's ja wohl nicht sein. Wer Elemente der HTTP-Komunikation mit Ausgaberoutine fuer HTML-Tags in ein Modul wirft, der hat Softwareentwicklung einfach nicht verstanden.
Im Grunde brauchst Du Dich um den ganzen Kram überhaupt nicht zu kümmern, wenn Du Dein Script sauber mit Modulen programmierst. Ohne machst Du viel zu viel potentiell falsch. Und in aller Regel nicht nur potentiell.
Wir wollen's mal nicht uebertreiben. Ein bisschen Querystring parsen ist ja nun wirklich keine programmiertechnische Meisterleistung.
So long
In Bezug auf die CGI.pm kann ich die Begeisterung aber nicht verstehen. Das Ding ist ein Ungetuem von ueber 6000 Zeilen Code in 190 kB.
Das ist oft schon mehr als der halbe Umfang einer ausgewachsenen serverseitigen Applikation. Es kostet schliesslich Zeit, den ganzen Mist jedesmal zu lesen und zu kompilieren.
Und wofuer? Um ein bisschen Formdaten zu lesen, was ich mit 5 Zeilen Perl auch kann? Sorry, das kann's ja wohl nicht sein.
Wer Elemente der HTTP-Komunikation mit Ausgaberoutine fuer HTML-Tags in ein Modul wirft, der hat Softwareentwicklung einfach nicht verstanden.
Ich kenne CGI.pm nicht "von innen", und was die interne Realisierung von Modulen angeht, bin ich auch nicht fit.
Deshalb: Könnte man einen solchen Modul nicht so strukturieren, daß man beim "require" (oder wo auch immer) nur die passenden Elemente lädt? (Autoloader?)
Oder vielleicht gibt es das sogar schon - einen "require CGI qw (irgendwas);", der nur das "Nötigste" lädt, statt der 6000 Zeilen?
Grübelgrübel ...
Nein, Perl-Liebhaber benutzen so etwas nicht, sondern param aus CGI.pm.
falsch...Perl liebhaber verzichten soweit es geht auf Module und programmieren alles selbst.
Unsinn. Der grosse Vorteil von Perl ist es, dass man auf sehr ausgereifte Module zurückgreifen kann; und eben nicht alles selbstprogrammieren muss. Wenn ich soetwas will, dann schreibe ich mir zuerst einen Assembler in Maschinensprache und programmiere dann in Assembler.
In welchem Zusammenhang moechtest Du das verwenden?
natürlich um einen Query String für andere CGI Scripte zu generieren.
Warum stellst du mir diese Frage, nachdem meine Frage schon mherfach in diesem Thread beantwortet wurde?
Ganz einfach: Du kennst sicherlich den Spruch viele Wege führen nach Rom. Je nach Zweck kann der eine oder der andere sinnvoller sein.
Peter