Ich habe ein seltsames Perl-Verhalten festgestellt: Die Verwendung einer Posix-Zeichenklasse in einem Regexp ändert die Sortierreihenfolge für die resultierenden Strings vollständig.Warum verwendet eine POSIX-Zeichenklasse in meinem Regex-Muster unerwartete Ergebnisse?
Hier ist mein Testprogramm:
sub namecmp($a,$b) {
$a=~/([:alpha:]*)/;
# $a=~/([a-z]*)/;
$aword= $1;
$b=~/([:alpha:]*)/;
# $b=~/([a-z]*)/;
$bword= $1;
return $aword cmp $bword;
};
$_= <>;
@names= sort namecmp split;
print join(" ", @names), "\n";
Wenn Sie die kommentierten-out regexp die Verwendung von [a-z] zu ändern, erhalten Sie die normale, lexikographische Sortierreihenfolge. Doch die Posix [: alpha:] Zeichenklasse liefert einige seltsame-ass Sortierreihenfolge wie folgt:
$test_normal
aaa aab aac aba abb abc aca acb acc baa bab bac bba bbb bbc bca bcb bcc caa cbb
aaa aab aac aba abb abc aca acb acc baa bab bac bba bbb bbc bca bcb bcc caa cbb
$test_posix
aaa aab aac aba abb abc aca acb acc baa bab bac bba bbb bbc bca bcb bcc caa cbb
baa bab bac bba bbb bbc bca bcb bcc caa cbb aba abb abc aca acb acc aab aac aaa
Meine beste Vermutung ist, dass die Posix Zeichenklasse eine Art von locale Sachen aktivierend habe ich noch nie gehört von und fragte nicht nach. Ich vermute die logische Reaktion auf "Doktor, Doktor, es tut weh, wenn ich das mache diese!" ist, "gut, tue 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.
Es gibt einige Programmierer, die, wenn sie mit Ausgang konfrontiert sie nicht erwarteten, dessen erster Instinkt ist * zu fragen * Was mache ich falsch? ** und finde es heraus. Dann gibt es diejenigen, deren erster Instinkt es ist zu fragen: Was macht der Compiler/Interpreter falsch? In der zweiten Kategorie fällt es schwerer, guten Code zu schreiben. –
Der häufigste Grund, warum Menschen unerwartetes Verhalten bekommen, ist, dass sie das Falsche erwarten. –