Hi,
$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!
Christians Lösung ist nur eine kleine Verallgemeinerung der meinen.
Bei deiner steigt jeder nicht-auch-nur-halbwegs-perl-Profi wie ich leider voll aus :-(
Schon der nicht-mehr-ganz-so-Perl-Anfänger kann in der Doku nachschlagen, was die einzelnen Teile bedeuten. Es mag zwar ein paar Minuten brauchen, bis Du diese RegExp verstehst, aber ein Geheimnis - oder auch nur kompliziert - ist sie nicht.
Dazu müsste man erst mal wissen, was (.) matcht (Irgendein einzelnes Zeichen?)
und was in $1 drinnenliegt (der gematchte Asudruck??)
Beides erfährst Du erstens in perldoc perlre, und sind zweitens die Grundlagen im Umgang mit Regular Expressions. Ebenso wie die Bedeutung des Parameters /e.
Übrigens, an welcher Ascii-Tabelle orientiert sich Perl, wenn man chr(xxx) aufruft?
Es gibt nur eine ASCII-Tabelle. Das "S" steht für "Standard".
Da sind ja die Zeichenbelegungen ziemlich unterschiedlich, zumindest bei den Sonderzeichen!
Bei allen nicht-ASCII-Zeichen siehst Du die Belegung, wenn Du mal kurz
for (128..255) {
print $_, "\t", chr($_), "\n";
}
auf die Konsole ausgeben läßt.
Cheatah