Ich habe ein merkwürdiges Perl-Verhalten festgestellt: Die Verwendung einer Posix-Zeichenklasse in einem Regexp ändert die Sortierreihenfolge für die resultierenden Strings vollständig.
Hier ist mein Testprogramm:
%Vor%Wenn Sie mit [a-z] zu den auskommentierten Regexps wechseln, erhalten Sie die normale, lexikografische Sortierreihenfolge. Die Posix [: alpha:] - Zeichenklasse ergibt jedoch eine seltsame Sortierreihenfolge wie folgt:
%Vor%Meine beste Vermutung ist, dass die Posix-Charakterklasse eine Art von lokalem Zeug aktiviert, von dem ich noch nie gehört habe und nicht danach gefragt habe. Ich nehme an, die logische Reaktion auf "Doktor, Doktor, es tut weh, wenn ich dieses mache!" ist, "gut, mach nicht das , dann!".
Aber kann mir jemand sagen, was hier passiert und warum? Ich benutze Perl 5.10, aber ich glaube, es funktioniert auch unter Perl 5.8.
Die Zeichenklasse [:alpha:]
steht für Alpha-Zeichen in regulären Perl-Ausdrücken, aber die eckigen Klammern bedeuten nicht , was sie normalerweise in regulären Ausdrücken tun. Du brauchst also:
Dies wird in perlre erwähnt:
%Vor%Die POSIX-Zeichenklassensyntax
%Vor%ist ebenfalls verfügbar. Beachten Sie, dass die Klammern
[
und]
Literal sind; Sie müssen immer in einem Zeichenklassenausdruck verwendet werden.
Ich habe ein merkwürdiges Perl-Verhalten festgestellt: Die Verwendung einer Posix-Zeichenklasse in einem Regexp ändert die Sortierreihenfolge für die resultierenden Strings vollständig.
Hier ist mein Testprogramm:
%Vor%Wenn Sie mit [a-z] zu den auskommentierten Regexps wechseln, erhalten Sie die normale, lexikografische Sortierreihenfolge. Die Posix [: alpha:] - Zeichenklasse ergibt jedoch eine seltsame Sortierreihenfolge wie folgt:
%Vor%Meine beste Vermutung ist, dass die Posix-Charakterklasse eine Art von lokalem Zeug aktiviert, von dem ich noch nie gehört habe und nicht danach gefragt habe. Ich nehme an, die logische Reaktion auf "Doktor, Doktor, es tut weh, wenn ich dieses mache!" ist, "gut, mach nicht das , dann!".
Aber kann mir jemand sagen, was hier passiert und warum? Ich benutze Perl 5.10, aber ich glaube, es funktioniert auch unter Perl 5.8.
Was du schreibst, ist Perl bei keiner Vorstellung. Sie können damit durchkommen, weil Sie warnings
deaktiviert haben. Wenn Sie Warnungen verwendet hätten, hätte perl
Ihnen das gesagt.
POSIX syntax [: :] belongs inside character classes in regex; marked by <-- HERE
in m/([:alpha:] <-- HERE *)/ at j.pl line 4.
POSIX syntax [: :] belongs inside character classes in regex; marked by <-- HERE
in m/([:alpha:] <-- HERE *)/ at j.pl line 8.
Stellen Sie sich das vor!
Nun, perl
hätte dir auch gesagt:
Illegal character in prototype for main::namecmp : $a,$b at j.pl line 3.
weil Perl nicht C ist. Perl hat keine Funktionsprototypen von der Art, die Sie zu benutzen scheinen.
Eine bessere Möglichkeit, in Perl die exakt gleiche Funktionalität zu schreiben, ist:
%Vor%Die Zeichenklasse %code% steht für Alpha-Zeichen in regulären Perl-Ausdrücken, aber die eckigen Klammern bedeuten nicht , was sie normalerweise in regulären Ausdrücken tun. Du brauchst also:
%Vor%Dies wird in perlre erwähnt:
%Vor%Die POSIX-Zeichenklassensyntax
%Vor%ist ebenfalls verfügbar. Beachten Sie, dass die Klammern %code% und %code% Literal sind; Sie müssen immer in einem Zeichenklassenausdruck verwendet werden.
Weil Perl keine POSIX-Zeichenklassen in diesem Formular unterstützt. (Verwenden Sie %code% . Siehe @ Gregs Antwort )
Also
%Vor%wird als Zeichenklasse interpretiert, die aus den Zeichen " %code% ", " %code% ", " %code% ", " %code% " und " %code% " besteht.
Nun, für Strings, die zu Beginn nicht %code% enthalten (wegen %code% ), z. " %code% " Die Übereinstimmung gibt eine leere Zeichenfolge zurück. Eine leere Saite ist natürlich kleiner als jede andere Saite, daher werden sie am Anfang arrangiert.
Weil Perl keine POSIX-Zeichenklassen in diesem Formular unterstützt. (Verwenden Sie [[:alpha:]]
. Siehe @ Gregs Antwort )
Also
%Vor% wird als Zeichenklasse interpretiert, die aus den Zeichen " a
", " h
", " l
", " p
" und " :
" besteht.
Nun, für Strings, die zu Beginn nicht [ahlp:]
enthalten (wegen *
), z. " baa
" Die Übereinstimmung gibt eine leere Zeichenfolge zurück. Eine leere Saite ist natürlich kleiner als jede andere Saite, daher werden sie am Anfang arrangiert.