Schrift
[thread]1029[/thread]

Objektorientiertes Programmieren

Leser: 1


<< >> 4 Einträge, 1 Seite
Strat
 2004-12-19 01:23
#10493 #10493
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
das problem dabei duerften die unterschiedlichen zeichensaetze sein... um umlaute zu verinternationalisieren wuerde ich folgendermaszen vorgehen:
Code (perl): (dl )
1
2
my %replacements = ('ä' => 'ae', 'Ä' => 'Ae', ......);
&#36string =~ s/(.)/ exists &#36replacements{&#36 1} ? &#36replacements{&#36 1} : &#36 1 /ge;

(ohne der leerzeichen zwischen $ und 1)
aber es gibt wahrscheinlich noch schnellere moeglichkeiten...

PS: das ist eine der wenigen Stellen, wo mir was aus Tcl besser gefaellt als das Aequivalent in Perl (string replace), weil die auch ein zeichen durch mehrere ersetzen kann, was der perl-operator tr (bzw. y) leider nicht kann\n\n

<!--EDIT|Strat|1103412302-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Crian
 2004-12-19 07:03
#10494 #10494
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=Strat,19.12.2004, 00:23]das problem dabei duerften die unterschiedlichen zeichensaetze sein... um umlaute zu verinternationalisieren wuerde ich folgendermaszen vorgehen:
Code (perl): (dl )
1
2
my %replacements = ('ä' => 'ae', 'Ä' => 'Ae', ......);
&#36string =~ s/(.)/ exists &#36replacements{&#36 1} ? &#36replacements{&#36 1} : &#36 1 /ge;

(ohne der leerzeichen zwischen $ und 1)
aber es gibt wahrscheinlich noch schnellere moeglichkeiten...

PS: das ist eine der wenigen Stellen, wo mir was aus Tcl besser gefaellt als das Aequivalent in Perl (string replace), weil die auch ein zeichen durch mehrere ersetzen kann, was der perl-operator tr (bzw. y) leider nicht kann[/quote]
Vielleicht mit split // und Zugriff auf Arrayelemente, allerdings würd ich mir keine Sorgen machen, bei Usereingaben. Das langsamste ist dann eh der User :)

Allgemein müsste man messen, was schneller ist. Aber sowas würd ich generell nur machen, wenn es an der Stelle nachgewiesener Maßen darauf ankommt.

Wenn z.B. das Program noch zig andere Umwandlungen mit regulären Ausdrücken vornimmt, ist es egal, wie lange dies dauert.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Gast Gast
 2004-12-18 21:52
#10495 #10495
Hallo
Ich weiss nicht ob man hier soetwas fragen darf aber ich hänge leicht an einem kleinen Programm welches wörter mit "ä" in ae umwandelt !
Ich habe zuerst den print : "Geben Sie Wörter mit .... ein"
und dann eine schleife nun möchte ich der schleife aber sagen das wenn \n eingegeben wurde abbrechen soll und dann wieder hoch zu print :" Geben Sie..." gehen soll sodass über der schleife eine schleife liegt
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#! /usr/bin/perl
print "Geben Sie Wörter mit \"\ä\" ein:\n";

while (defined ($d = getc STDIN)) {

if ($d eq "ä"){
print "ae";
}
else {
print "$d";
}
}


Ich hoffe jemand hat eine Idee.
Danke
Dubu
 2004-12-19 02:36
#10496 #10496
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
(Warum steht die Frage eigentlich im Forum "sonstige Sprachen", obwohl es doch eindeutig um Perl geht? Und warum lautet der Betreff "Objektorientiertes Programmieren", obwohl ueberhaupt nicht von OO-Programmierung die Rede ist? Sei's drum...)

Da getc() sowieso nicht gleich jedes Zeichen von STDIN verarbeitet und ausserdem ziemlich ineffizient ist, wuerde ich den Diamant-Operator fuer die Eingabe bevorzugen. Da hat man automatisch einen neuen Schleifendurchgang fuer jede Zeile:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl
use strict;
use warnings;

while (1) {
   print "Geben Sie Wörter mit \"\ä\" ein:\n";
   my $text = <>;
   last if $text eq "\n";      # Abbruch, wenn keine Eingabe

   $text =~ s/ä/ae/g;          # alle ä durch ae ersetzen
   print $text;
}


Wenn es mehr Ersetzungen zu machen gibt, dann wuerde ich auch strats Methode mit dem Hash nehmen.
<< >> 4 Einträge, 1 Seite



View all threads created 2004-12-19 01:23.