Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
rot13 mit perl

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - Allgemein
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
prof



Anmeldungsdatum: 03.05.2000
Beiträge: 26

BeitragVerfasst am: 18. Jul 2000 16:12   Titel: rot13 mit perl

Ich habe ein Perlskript geschrieben, welches das Programm rot13 ersetzt (und noch 6* kleiner ist )
code:

#!/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, "\n";
}



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
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden

Jochen
Gast





BeitragVerfasst am: 19. Jul 2000 6:56   Titel: Re: rot13 mit perl

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):
code:

#!/bin/sh
tr "[A-Z][a-z]" "[N-Z][A-M][n-z][a-m]"


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 ) kann man auch Dateinamen als Parameter verwenden.

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

prof



Anmeldungsdatum: 03.05.2000
Beiträge: 26

BeitragVerfasst am: 19. Jul 2000 9:16   Titel: Re: rot13 mit perl

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
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden

Jochen
Gast





BeitragVerfasst am: 19. Jul 2000 15:11   Titel: Re: rot13 mit perl

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

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? )

Meine letzte Lösung:
code:

#!/bin/sh
cat $1 | tr "[A-Z][a-z]" "[N-Z][A-M][n-z][a-m]"



Ist $1 leer, wird das Argument von der Shell gestrichen, und cat liest von stdin. Also kein if/then/else und so'n Pipifax.

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



Anmeldungsdatum: 03.05.2000
Beiträge: 26

BeitragVerfasst am: 19. Jul 2000 19:47   Titel: Re: rot13 mit perl

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
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden

Jochen
Gast





BeitragVerfasst am: 20. Jul 2000 7:31   Titel: Re: rot13 mit perl

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!
 

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - Allgemein Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy