/b anpassen
am 26.06.2006 10:39:00 von unknownPost removed (X-No-Archive: yes)
Post removed (X-No-Archive: yes)
Martin Trautmann schrieb:
> Hallo,
>
> kann man das \b selbst konfigurieren?
>
> Ich moechte es gerne um die Umlaute erweitern. Andernfalls liefert mir
> z.B. ein
>
> perl -e '"Der Straßenfeger Emil" =~ /(\bE\S*)/i; print $1'
>
> schon die Wortgrenze am ß: enfeger
Benutze "use locale;".
perldoc locale
Wolf
Post removed (X-No-Archive: yes)
Martin Trautmann wrote:
> On Mon, 26 Jun 2006 10:49:05 +0200, Wolf Behrenhoff wrote:
>> > kann man das \b selbst konfigurieren?
>> >
>> > Ich moechte es gerne um die Umlaute erweitern.
>
>
>> Benutze "use locale;".
>> perldoc locale
>
> Ja, ich kann natuerlich ein
> setlocale(LC_CTYPE, "de_DE.ISO8859-1")
> verwenden (-> perllocale).
Du kannst auch einfach UTF-8-Strings verwenden:
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
"Der StraÃenfeger Emil" =~ /(\bE\S*)/i; print $1
und
#!/usr/bin/perl
use strict;
use warnings;
my $x = "Der Stra\x{00df}enfeger Emil";
utf8::upgrade($x);
$x =~ /(\bE\S*)/i;
print $1
geben beide "Emil" aus. (das erste Script muss als UTF-8 abgespeichert
sein, wie man am "use utf8" erkennen kann).
> Aber ich wollte eigentlich nur das \b entsprechend anpassen.
> Geht das auch?
\b ist definiert als "Zwischenraum zwischen einem Word- und einem
Non-Word-Character". Diese Definition kannst Du nicht ändern. Was als
Word- und als Nonword-Character gilt, wird im Allgemeinen über die
Locale festgelegt. Du kannst Dir eine eigene Locale definieren, in der
Umlaute Buchstaben sind, aber das X nicht, wenn Dir das Spaà macht.
Allerdings ist die Frage, wie Du das machst, keine Perl-Frage, sondern
eine Frage Deines Betriebssystems. In Unicode ist diese Zuordnung fix
(steht im Unicode-Standard) daher funktionieren meine zwei Scripts auch
ohne explizite Locale. Wenn Du nicht wirklich sehr spezielle
Anforderungen hast, sollte das reichen.
> Wenn wir aber schon dabei sind (auch wenn's eher nach .cgi gehoert): Wie
> mache ich sinnvollerweise die Pruefung einer Eingabe aus einem
> Textfield, das mit einer lokalen Datei in 8859-1 vergleichen soll?
>
> laienhafter Ansatz:
>
> use CGI;
> $texteingabe = param('text');
>
>
> # Pruefung, ob Eingabe in UTF-8 erfolgte
> # -> Konvertierung
Alle (mir bekannten) Browser schicken den Inhalt von Forms in dem
charset zurück, das die HTML-Page page hatte, in dem die Form war. Wenn
Du also Deine Forms immer in utf-8 ausgibst, bekommst Du immer UTF-8
zurück.
> $texteingabe = utf8::decode($texteingabe) if utf8::is_utf_8($texteingabe);
Ich glaube, Du willst in perldoc utf8 nochmal nachlesen, was decode und
is_utf8 machen.
In perldoc Encode wirst Du wahrscheinlich eher finden, was Du suchst.
Dann kannst Du Dir das setlocale hier sparen:
> #An der Stelle nutze ich wohl das use locale;
> setlocale(LC_CTYPE, "de_DE.ISO8859-1");
[...]
> $texteingabe =~ s/Ã/(ss|Ã|sss)/ig; # Rechtschreibreform!
Ich habe ja schon viel Seltsames über die Rechtschreibreform gelesen,
aber dass das "Ã" irgendwo durch "sss" ersetzt worde wäre noch nicht.
hp
--
_ | Peter J. Holzer | Man könnte sich [die Diskussion] auch
|_|_) | Sysadmin WSR/LUGA | sparen, wenn man sie sich einfach sparen
| | | hjp@hjp.at | würde.
__/ | http://www.hjp.at/ | -- Ralph Angenendt in dang 2006-04-15
Post removed (X-No-Archive: yes)
Martin Trautmann wrote:
> On Mon, 26 Jun 2006 23:41:36 +0200, Peter J. Holzer wrote:
>> Du kannst auch einfach UTF-8-Strings verwenden:
>
> Nee, ich will eigentlich auf 8bit-Zeichen bleiben.
>
>> #!/usr/bin/perl
>> use strict;
>> use warnings;
>>
>> my $x = "Der Stra\x{00df}enfeger Emil";
>> utf8::upgrade($x);
>> $x =~ /(\bE\S*)/i;
>> print $1
>>
>> geben beide "Emil" aus. (das erste Script muss als UTF-8 abgespeichert
>> sein, wie man am "use utf8" erkennen kann).
>
> ich glaube, ich werde das eher verwenden, um alle UTF-Umlaute, die mich
> interessieren, erst mal nach Latin-1 zu konvertieren. Der Rest wird
> verworfen.
Ich finde es umgekehrt einfacher, aber bitte.
>> > Aber ich wollte eigentlich nur das \b entsprechend anpassen.
>> > Geht das auch?
>>
>> \b ist definiert als "Zwischenraum zwischen einem Word- und einem
>> Non-Word-Character". Diese Definition kannst Du nicht ändern.
>
> Ok - dann muss ich wohl wirklich ueber die locale. Oder gibt's ein
> aequivalentes [^\a\däöüÃÃÃÃ]* ?
Alles auÃer einem Piepston, einer Ziffer und einem deutschen Umlaut?
Würde mich wundern, wenn die Kombination oft genug gebraucht würde, um
eine Abkürzung zu rechtfertigen. Wenn Du das brauchst, wirst Du es schon
ausschreiben müssen. Unter der Annahme, dass Du statt \a [:alpha:]
schreiben wolltest, würde ich aber einfach \W* (oder exakter:
[^[:alnum::]*) schreiben, solange ich andere Zeichen mit Akzent nicht
explizit als "Nicht-Buchstaben" behandeln will.
>> > $texteingabe =~ s/Ã/(ss|Ã|sss)/ig; # Rechtschreibreform!
>>
>> Ich habe ja schon viel Seltsames über die Rechtschreibreform gelesen,
>> aber dass das "Ã" irgendwo durch "sss" ersetzt worde wäre noch nicht.
>
> Nimm irgendwas wie z.B. "GroÃschreibung".
"GroÃschreibung" schreibt man immer noch "GroÃschreibung". Ein besseres
Beispiel wäre "Flussschifffahrt" (früher: "FluÃschiffahrt"). Da kommen
zwar 3 s hintereinander vor, aber nur zwei davon stammen vom "Ã", eines
vom "sch". Wenn Du das "Ã" durch "sss" ersetzt, würde daraus eine
"Flusssschiffahrt" und das ist ein s zuviel (und ein f zuwenig).
> Wenn alle Stufen zuvor
> scheiterten, dann moechte ich z.B. sowas machen:
>
>
> $search = param('suche'):
> $search = tr/a-zäöü/A-ZÃÃÃ/;
>
> open(FILE, "data.txt"):
> while(
> print $_ if /^$search/;
> }
> close(FILE);
>
> Eingabe: Grosschreibung
>
> FILE:
> Datum 2006-02-26
> GroÃschreibung Ja
>
> Wenn die Eingabe nicht 1:1 passt, dann will ich
>
> 1) case-insensitive suchen. Ich vermute, das geht zwar recht
> effizient auf ASCII-Zeichen, aber wird mit 8bit-Zeichen oder
> gar UTF recht muehsam?
Für Dich oder den Prozessor? Für Dich macht es wenig Unterschied. Du
schreibst in jedem Fall einfach i hintendran.
Für den Prozessor sind Regexes auf UTF-8-Strings im Allgemeinen mehr
Arbeit, bei 8-Bit-Zeichen hängt das wohl von der Locale ab, sollte aber
nicht sehr viel Unterschied machen. Den Unterschied muss man aber
messen, um Aussagen treffen zu können, mit raten kommt man da auf keinen
grünen Zweig:
#!/usr/bin/perl
use utf8;
use strict;
use Benchmark qw(cmpthese);
my $ascii = "the quick brown fox jumps over the lazy dog";
my $utf8 = "the quick brown fox jumps over the lazy dog";
utf8::upgrade($utf8);
my $utf8_2 = $utf8;
$utf8_2 =~ s/o/ö/g;
cmpthese (1_000_000, {
'ascii' => sub { $ascii =~ m/fox jumps/; },
'utf8' => sub { $utf8 =~ m/fox jumps/; },
'utf8_2' => sub { $utf8_2 =~ m/föx jumps/; },
});
Ergibt bei mir das (mir unerklärliche) Ergebnis:
Rate utf8 utf8_2 ascii
utf8 440529/s -- -56% -67%
utf8_2 1010101/s 129% -- -23%
ascii 1315789/s 199% 30% --
Dass ascii am schnellsten ist, war zu erwarten. Dass aber utf8 dreimal
länger braucht, obwohl es genau das gleiche macht (sowohl String als
auch Pattern enthalten nur ASCII-Zeichen) ist unerwartet. Und dass
utf8_2 in der Mitte zwischen beiden liegt, noch unerwarteter.
hp
--
_ | Peter J. Holzer | Man könnte sich [die Diskussion] auch
|_|_) | Sysadmin WSR/LUGA | sparen, wenn man sie sich einfach sparen
| | | hjp@hjp.at | würde.
__/ | http://www.hjp.at/ | -- Ralph Angenendt in dang 2006-04-15
Peter J. Holzer wrote:
> Dass ascii am schnellsten ist, war zu erwarten. Dass aber utf8 dreimal
> länger braucht, obwohl es genau das gleiche macht (sowohl String als
> auch Pattern enthalten nur ASCII-Zeichen) ist unerwartet. Und dass
> utf8_2 in der Mitte zwischen beiden liegt, noch unerwarteter.
Ja, interessant.
Scheint vom Pattern abzuhängen:
#!/usr/bin/perl
use utf8;
use strict;
use Benchmark qw(cmpthese);
my $ascii = "the quick brown fox jumps over the lazy dog";
my $u8 = "the quick brown fox jumps över the lazy dog";
$u8 =~ s/a/ä/g;
#utf8::upgrade($utf8);
my $utf8_2 = $u8;
$utf8_2 =~ s/o/ö/g;
cmpthese (2_000_000, {
'ascii' => sub { $ascii =~ m/fox jumps/; },
'utf8_2' => sub { $utf8_2 =~ m/föx jumps/; },
'u8' => sub { $u8 =~ m/the läzy/; },
});
Rate utf8_2 u8 ascii
utf8_2 1941748/s -- -5% -27%
u8 2040816/s 5% -- -23%
ascii 2666667/s 37% 31% --
Netter Performance-Bug. Meldest den Du ein?
Helmut Wollmersdorfer
Post removed (X-No-Archive: yes)
Helmut Wollmersdorfer wrote:
> Peter J. Holzer wrote:
>> Dass ascii am schnellsten ist, war zu erwarten. Dass aber utf8 dreimal
>> länger braucht, obwohl es genau das gleiche macht (sowohl String als
>> auch Pattern enthalten nur ASCII-Zeichen) ist unerwartet. Und dass
>> utf8_2 in der Mitte zwischen beiden liegt, noch unerwarteter.
>
> Ja, interessant.
> Scheint vom Pattern abzuhängen:
[...]
> 'u8' => sub { $u8 =~ m/the läzy/; },
^^^^^^^^
Das matcht nicht, ist also nur bedingt vergleichbar. Aber ja,
Regexp-Matches auf UTF-8-Strings scheinen flott zu sein, wenn das Pattern
ebenfalls als UTF-8-Pattern erkennbar ist.
> Netter Performance-Bug. Meldest den Du ein?
http://rt.perl.org/rt3/Ticket/Display.html?id=39654
hp
--
_ | Peter J. Holzer | Man könnte sich [die Diskussion] auch
|_|_) | Sysadmin WSR/LUGA | sparen, wenn man sie sich einfach sparen
| | | hjp@hjp.at | würde.
__/ | http://www.hjp.at/ | -- Ralph Angenendt in dang 2006-04-15
Peter J. Holzer wrote:
> Das matcht nicht, ist also nur bedingt vergleichbar.
Den Code davor nicht (genau) gelesen?
Und ja, wenn es nicht matcht, dann kann es recht schnell sein - hatte
ich auch unabsichtlich.
> http://rt.perl.org/rt3/Ticket/Display.html?id=39654
Thx.
Helmut Wollmersdorfer
Helmut Wollmersdorfer wrote:
> Peter J. Holzer wrote:
>> Das matcht nicht, ist also nur bedingt vergleichbar.
>
> Den Code davor nicht (genau) gelesen?
Offensichtlich, ja.
hp
--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst w�e der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd