Thread Nur einen Buchstaben in Buchstabenkombination ersetzen
(15 answers)
Opened by Gast at 2012-11-17 17:22
Mal als Ansatz, die Mustergenerierung ist der Übersicht halber in eine sub ausgelagert.
Es findet keinerlei Prüfung der Benutzereingaben statt, d.h. die Regel muss das Format <ersetze_was>/<ersetze_durch>/<Muster> haben. Das Muster muss die einfache Struktur mit einem Unterstrich als Platzhalter haben. Wenn Du das Prinzip verstanden hast, sind Erweiterungen für Dich schaffbar ;) edit: Diese simple Variante hat ihre Tücken, so darf innerhalb der Regeln und Kategorien kein sog. Metazeichen stehen (z.B. ) oder *). Für weitergehende Experimente müsstest Du Dich mit quotemeta(), qr() und Konsorten beschäftigen. Ein gutes Regex-Tutorial (Englisch) gibt es z.B. hier. Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 use warnings; use strict; $| = 1; my @categories = ( 'V=aeiou', 'P=pbtdkg' ); while (1) { print "Text: "; my $text = <STDIN>; chomp($text); last if ! $text; # Leere Eingabe beendet Schleife print "Regel: "; my $rule = <STDIN>; chomp($rule); last if ! $rule; my ($search, $replace) = build_regex($rule); $text =~ s/$search/$replace/g; print "\nMuster: $search\n\nNach Ersetzung: $text\n\n"; } sub build_regex { # build_regex($rule); my ($to_replace, $replace_with, $pattern) = split('/', $_[0]); for my $category (@categories) { my ($type, $class) = split('=', $category); $pattern =~ s/$type/[$class]/g; } $pattern =~ s/(.+)_/(?<=$1)_/; $pattern =~ s/_(.+)/_(?=$1)/; $pattern =~ s/_/$to_replace/; # <--- edit return ($pattern, $replace_with); } __END__ Beispieldurchlauf: Code: (dl
)
1 Text: akrta Editiert von FIFO: $pattern-Bearbeitung korrigiert Last edited: 2012-11-18 10:23:34 +0100 (CET) Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"
|