Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Wolle-77 •--->


Anmeldedatum: 25.02.2003 Beiträge: 449 Wohnort: Geldern
|
Verfasst am: 05.09.2006 - 11:22 Titel: Frage für Skeeve |
|
|
Hallo (Skeeve),
schon des Öfteren hast Du hier ja gezeigt, wie mächtig Perl mit Texten umgehen kann.
Ich frage mich, ob es Dir möglich ist, diesen Buchstabensalat in schneller Perl-Methode nachzubilden.
Beispielsatz: "Es ist eagl, in wceelhr Rfgonlheeie Bhuaestcbn setehn; nur der etrse und ltetze muß riitchg setehn , man knan die Ttexe eathciselnurr Wisee tztderom ncoh lseen."
Das habe ich vor ein paar Jahren in meine TextMachine eingebaut (mit herkömmlichen AppleScript-Methoden) und auch Snow hat das hier mal als Snippet gepostet.
Also, Grundprinzip ist: Trenner sind blanks; Satzzeichen !",. usw. dürfen nicht mitgemischt werden, dann bleibt erster und letzter Buchstabe eines Wortes stehen und der Rest wird in zufälliger Reihenfolge wieder eingefügt, wobei jeder vorherige Buchstabe auch nur einmal wieder benutzt werden darf.
Ist sowas möglich und wie kurz? _________________ Martin Wolter
--
Apple rocks the planet! |
|
Nach oben |
|
 |
Skeeve •---->


Anmeldedatum: 20.04.2006 Beiträge: 1068
|
Verfasst am: 05.09.2006 - 12:23 Titel: Re: Frage für Skeeve |
|
|
Klar ist das möglich. Auch sehr kurz. Folgende Fragen dazu:
- Wo kommt der Text her? Darf ich eine Datei voraussetzen die per Eingabeumleitung gelesen wird, oder muß das Perl Programm die selbst öffnen?
- Müssen Fehler abgefangen werden oder ist das egal und okay, wenn das Programm einfach merkwürdig reagiert, sollte die Datei z.B. fehlen.
- Länger und verständlich oder
- kurz und kryptisch
- oder gar beides?
|
|
Nach oben |
|
 |
Skeeve •---->


Anmeldedatum: 20.04.2006 Beiträge: 1068
|
Verfasst am: 05.09.2006 - 13:17 Titel: kurz & kryptisch |
|
|
Code: | perl -pe 'sub c{for($i=@_;--$i;($_[$i],$_[$j])=($_[$j],$_[$i])){$j=rand$i}join"",@_}s:(?<=\b\w)(\w+)(?=\w\b):c split//,$1:eg' < text |
|
|
Nach oben |
|
 |
Wolle-77 •--->


Anmeldedatum: 25.02.2003 Beiträge: 449 Wohnort: Geldern
|
Verfasst am: 05.09.2006 - 14:10 Titel: |
|
|
Hi Skeeve,
Danke für die Antwort(en).
Das Script sollte ruhig der Performance zulastig nicht zu kryptisch werden (oder einfach eine zweite Variante) und es wäre schön, wenn eine gepipte Standardausgabe genommen würde.
Also per echo in perl gepiped oder so? _________________ Martin Wolter
--
Apple rocks the planet! |
|
Nach oben |
|
 |
Skeeve •---->


Anmeldedatum: 20.04.2006 Beiträge: 1068
|
Verfasst am: 05.09.2006 - 14:21 Titel: |
|
|
Code: | #/usr/bin/perl -p
sub scramble {
for ( my $i= @_; --$i; ) {
my $j= rand $i;
($_[$i],$_[$j])= ($_[$j],$_[$i]);
}
join "", @_;
}
s:(?<=\b\w)(\w+)(?=\w\b):scramble split //, $1:eg;
|
Aufruf ist natürlich auch als pipe möglich.
Code: | echo "testtext zum verscramblen" | scramble > verscrambled |
oder
Code: | cat file | scramble > verscrambled |
oder
Code: | scramble < file > verscrambled |
|
|
Nach oben |
|
 |
Wolle-77 •--->


Anmeldedatum: 25.02.2003 Beiträge: 449 Wohnort: Geldern
|
Verfasst am: 05.09.2006 - 20:50 Titel: |
|
|
Hallo Skeeve,
ich meinte mit weniger kryptisch aber kein reines ShellScript.
So etwas wäre ideal zur Verwendung innerhalb von AppleScript:
Code: |
set meintext to "Dies ist ein Beispielsatz"
do shell script "perl -pe 'sub c{for($i=@_;--$i;($_[$i],$_[$j])=($_[$j],$_[$i])){$j=rand$i}join\"\",@_}s:(?<=\\b\\w)(\\w+)(?=\\w\\b):c split//,$1:eg' < " & meintext
|
Das läuft zwar, aber perl erwartet hier sicherlich eine Datei, oder? Jetzt könnte man diese ja temporär zwischenspeichern, aber geht das nicht auch als intern übergebene Variable?
Ich sehe schon, damit das innerhalb von do shell script läuft, muß man das immer auf einen Einzeiler und damit nicht leicht zu lesen reduzieren..., oder? _________________ Martin Wolter
--
Apple rocks the planet! |
|
Nach oben |
|
 |
Skeeve •---->


Anmeldedatum: 20.04.2006 Beiträge: 1068
|
Verfasst am: 06.09.2006 - 08:58 Titel: |
|
|
Wolle-77 hat Folgendes geschrieben: | Hallo Skeeve,
ich meinte mit weniger kryptisch aber kein reines ShellScript. |
Na dann sag das doch gleich! Da Du gezielt nach Perl gefragt hast, habe ich das natürlich auch entsprechend umgesetzt. Du möchtest also einen Filter für AppleScript.
Na gut... Da werde ich dann auch mal was abliefern - später. Jetzt muß ich erstmal "anschaffen gehen"  |
|
Nach oben |
|
 |
Skeeve •---->


Anmeldedatum: 20.04.2006 Beiträge: 1068
|
Verfasst am: 06.09.2006 - 10:43 Titel: |
|
|
Kurze Pause (warten auf Ende eines "Compilerlaufs) und hier haben wir es:
Code: | property scramble : "cat <<'" & (ASCII character 7) & "' | perl
sub scramble {
for ( my $i= @_; --$i; ) {
my $j= rand $i;
($_[$i],$_[$j])= ($_[$j],$_[$i]);
}
join q//, @_;
}
while (<DATA>) {
s:(?<=\\b\\w)(\\w+)(?=\\w\\b):scramble split //, $1:eg;
print;
}
__DATA__
"
set theText to "Alle meine Entchen
schwimmen auf dem See, schwimmen auf dem See,
Koepfchen in das Wasser, Schwaenzchen in die Hoeh'.
Alle meine Gaenschen
watscheln durch den Grund, watscheln durch den Grund,
Suchen in dem Tuempel, werden kugelrund.
Alle meine Huehner
scharren in dem Stroh, scharren in dem Stroh,
Finden sie ein Koernchen, sind sie alle froh.
Alle meine Taeubchen
gurren auf dem Dach, gurren auf dem Dach,
Fliegt eins in die Luefte, fliegen alle nach."
do shell script scramble & theText |
Beachte:
- Es gibt ein Limit für die Größe bei do shell script
- Im Text darf der ASCI Character 3 nicht auftauchen, da ich den als Ende Zeichen verwendet habe (in ASCII als end of text definiert). Es ist allerdings nicht nötig, den Character auch wirklich ans Ende zu setzen. Also nicht wundern, daß er nicht auftaucht.
- Ausführungstechnisch (Performanz) könnte es besser sein, wirklich Dateien zu verwenden oder gegebenenfalls sogar named pipes (FIFOs) und den scrambler im Hintergrund laufen zu lassen
|
|
Nach oben |
|
 |
Wolle-77 •--->


Anmeldedatum: 25.02.2003 Beiträge: 449 Wohnort: Geldern
|
Verfasst am: 06.09.2006 - 12:15 Titel: |
|
|
Hallo Skeeve,
vielen Dank für Deinen Einsatz. Also das verstehe ich auf Anhieb erstmal nicht; ist eine Stufe zu hoch.
Ich werde es mir mal anschauen und experementieren. Vielen Dank dafür. _________________ Martin Wolter
--
Apple rocks the planet! |
|
Nach oben |
|
 |
Skeeve •---->


Anmeldedatum: 20.04.2006 Beiträge: 1068
|
Verfasst am: 06.09.2006 - 13:42 Titel: |
|
|
Wolle-77 hat Folgendes geschrieben: | Hallo Skeeve,
vielen Dank für Deinen Einsatz. Also das verstehe ich auf Anhieb erstmal nicht; ist eine Stufe zu hoch. |
Schau mal in den ersten Thread in diesem Unterforum. Ich habe dazu was geschrieben. |
|
Nach oben |
|
 |
|