Calocybe: Mit Perl den ASCII-Wert eines Zeichens ändern

Beitrag lesen

Hi Bernhard!

viel zu statisch, besser so in der Richtung:
$string =~ s/(.)/chr(ord($1)-5)/eg;

mag sein, aber verstehen, wenn man bei regexpr. das überhaupt sagen kann ;-) tut man cheatahs Version am ehesten!

Der Unterschied ist, dass Christians Version von *jedem* Zeichen 5 abziehen kann, nicht nur vom A.

Dazu müsste man erst mal wissen, was (.) matcht (Irgendein einzelnes Zeichen?)
und was in $1 drinnenliegt (der gematchte Asudruck??)

Da gebe ich Cheatah recht, das sind wirklich die elementaren Grundlagen der RegExpe, aber Dein Gefuehl hat Dich ja schon in die richtige Richtung gefuehrt. Bleibt noch zu erwaehnen, dass das e nach dem letzten / bedeutet, dass der Ersetzungsausdruck keine Zeichenkette ist, sondern als Perl-Statement ausgewertet wird. Aber das hats Du Dir sicher auch schon gedacht oder - noch besser - mittlerweile in perlre (diesmal ohne f *g*) gelesen. ;-)

Übrigens, an welcher Ascii-Tabelle orientiert sich Perl, wenn man chr(xxx) aufruft? Da sind ja die Zeichenbelegungen ziemlich unterschiedlich, zumindest bei den Sonderzeichen! Gibts da einen Standardzeichensatz?

An gar keiner. Letztlich sind im Computer nur Zahlen drin und keine Zeichen. Und auch nach der Umwandlung mit chr() steht im Speicher in Wirklichkeit eine Zahl (dieselbe wie vorher), nur Perl weiss jetzt, dass es diesen Skalar als Zeichen behandeln soll und nicht als Zahl. Erst bei einer Ausgabe auf dem Bildschirm wird die in genau diesem Moment aktive Zeichentabelle verwendet, um das zu der Zahl zugehoerige Zeichen herauszusuchen. Wenn die Bildschirmausgabe auf der Console erfolgt, wird eben der Font der Console verwendet, werden die Zeichen aber zu einem Browser geschickt, wird eben die auf dem Client-Rechner aktive Zeichentabelle verwendet (welche sich in HTML wiederum durch ein META-Tag beeinflussen laesst).

(Tatsaechlich gibt es nur eine echte (US-)ASCII-Tabelle, die nur aus den Zeichen 0 bis 127 besteht. Alles was danach kommt, sind andere Zeichensaetze nach irgendeiner Norm, z.B. iso-8859-1.)

So long