Я столкнулся с некоторым странным поведением Perl: использование класса символов Posix в регулярном выражении полностью меняет порядок сортировки для результирующих строк.
Вот моя тестовая программа:
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";
Если вы переключитесь на закомментированное регулярное выражение, используя [a-z], вы получите нормальный лексикографический порядок сортировки. Тем не менее, класс символов Posix [: alpha:] выдает странный порядок сортировки:
$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
Мое лучшее предположение состоит в том, что класс символов Posix активирует некоторые локали, о которых я никогда не слышал и о которых не просил. Я предполагаю логическую реакцию на "доктор, доктор, мне больно, когда я делаю это !" это «ну, не делай , что , тогда!».
Но кто-нибудь может мне сказать, что здесь происходит и почему? Я использую Perl 5.10, но я считаю, что он также работает под Perl 5.8.