rot13 mit perl

Post Reply
Message
Author
prof
Posts: 26
Joined: 03. May 2000 12:42

rot13 mit perl

#1 Post by prof »

Ich habe ein Perlskript geschrieben, welches das Programm rot13 ersetzt (und noch 6* kleiner ist <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">)
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/usr/bin/perl -w

while (5 < 23){
$klar = <>;
chomp $klar;
@fertig = split / */, $klar;
foreach $buchstabe (@fertig){
ROT: for ($i=1 ; $i<=13 ; $i++){
last ROT if ($buchstabe =~ /[^ \w]/);
++($buchstabe);
}
$buchstabe =~ s/a(.)/$1/;
}
print @fertig, "\<!--no-->n";
}
</font><hr></pre></blockquote>

Ich fände es gut und hilfreich, wenn auch andere hier im Forum (kleine) Perlskripts, die sie programmiert haben, posten würden; wie denkt ihr darüber?
I hate my telephone. Please don't ask for my phone number.
--Larry Wall

Jochen

Re: rot13 mit perl

#2 Post by Jochen »

Was denn?!? Korrigier mich bitte, wenn ich mich irre, aber rot13 ist doch nur ein Verschieben jedes Buchstaben um 13 Positionen im Alphabet weiter, oder? Ich kann ja nun kein Perl, aber dazu gibts ja schliesslich auch tr(1):
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/sh
tr "[A-Z][a-z]" "[N-Z][A-M][n-z][a-m]"
</font><hr></pre></blockquote>
Das ist jetzt natürlich nur ein Filter, d.h. lesen von stdin und schreiben nach stdout, aber mit minimalem Shellaufwand (weniger als Dein Perl zumindest <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">) kann man auch Dateinamen als Parameter verwenden.

Oder macht Dein Algorithmus auch noch was anderes (Umlaute berücksichtigen oder so)?

prof
Posts: 26
Joined: 03. May 2000 12:42

Re: rot13 mit perl

#3 Post by prof »

Mein Skript rotiert nur alphanumerische Zeichen [a-zA-Z0-9] und ignoriert auch Umlaute.
Dein Skript müsste so heißen(es ignoriert auch Umlaute und den ganzen anderen Quatsch):

#!/bin/bash
if [ -n $1 ];then
cat $1 | tr "[A-M][N-Z][a-m][n-z]" "[N-Z][A-M][n-z][a-m]"
else
tr "[A-M][N-Z][a-m][n-z]" "[N-Z][A-M][n-z][a-m]"
fi

Was mich auf eine Idee bringt (die kürzer als das obere Skript ist):

#!/usr/bin/perl -w
while (<>){
@_ = split / */, $_;
foreach $_ (@_){
tr/[a-m][n-z][A-M][N-Z]/[n-z][a-m][N-Z][A-M]/;
}
print @_;
}

oder ganz kurz(Damit will ich zeigen, dass du irgendwelche anderen Programme benutzt, was man auch übertreiben kann. Oder will ich damit zeigen, dass ich Rekursion mag?):

#!/bin/bash
if [ -n $1 ];then
cat $1 | rot13
else
rot13
fi
I hate my telephone. Please don't ask for my phone number.
--Larry Wall

Jochen

Re: rot13 mit perl

#4 Post by Jochen »

<i>Damit will ich zeigen, dass du irgendwelche anderen Programme benutzt, was man auch übertreiben kann</i>

Also, ob ich nun einen tr-Aufruf oder einen perl-Aufruf mache: Das Ergebnis ist das gleiche, oder? Ob Shellskript (bash, ksh, was auch immer) oder Perl-Skript ist egal, Hauptsache einigermassen effizient. Da dürfte tr als Spezialtool ggf. etwas schneller sein als Perl, dass ja trotz Zwischencode (Bytecode?) immer noch geskriptet ist. (Korrigier mich, wenn ich da was falsch verstanden habe). Ich bin mir auch bewusst, dass meine Lösung den Overhead weiterer Prozesse haben kann - je nach Ausstattung.

Aber das ist ja das Schöne an Unix/Linux: Es gibt mehr als nur einen Weg. (Oder habe ich da ein Kamel-Motto entführt? <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">)

Meine letzte Lösung:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/sh
cat $1 | tr "[A-Z][a-z]" "[N-Z][A-M][n-z][a-m]"
</font><hr></pre></blockquote>

Ist $1 leer, wird das Argument von der Shell gestrichen, und cat liest von stdin. Also kein if/then/else und so'n Pipifax. <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

In der Hinsicht solltest Du Dein Shell-Skript oben noch mal checken:
Wenn $1 leer ist, wird das test-Kommando nach dem if ([ -n $1 ]) nach dem -n ohne Argument aufgerufen, was einen Syntax-Fehler verursacht. Verwende statt dessen " um $1 (also "$1", mit den Gänsefüsschen), dann erhält das test-Kommando genau ein Argument, auch wenn dieses dann einen Leerstring enthält. Wie die Werbung sagt: Der Unterschied ist nicht gross, aber fein!

Grüsse,

Jochen

prof
Posts: 26
Joined: 03. May 2000 12:42

Re: rot13 mit perl

#5 Post by prof »

Ok... du hast gewonnen dein Skript ist kürzer aber deinen Verbesserungsvorschlag für mein bash-Skript verstehe ich nicht, bei mir läuft es einwandfrei.
I hate my telephone. Please don't ask for my phone number.
--Larry Wall

Jochen

Re: rot13 mit perl

#6 Post by Jochen »

Grummel... Ich bin halt schon verdorben von der echten, alten Bourne-Shell. Die bricht an dieser Stelle mit "test: argument expected" ab. Die ash beschwert sich ebenfalls, läuft dann weiter in den else-Fall, und bash und pdksh haben absolut keine Probleme damit.

Fazit: Vergiss meinen Tipp, wenn Du nur auf modernen UNIX/Linux-Varianten arbeitest. Solltest Du irgendwo noch mit 'ner alten sh zu tun haben, dann immer "" um die Variablen setzen, wenn sie auch leer sein könnten!

Post Reply