Tôi đã gặp phải một số hành vi Perl lạ: sử dụng một lớp nhân vật Posix trong một regexp hoàn toàn thay đổi thứ tự sắp xếp cho các chuỗi kết quả.Tại sao sử dụng một lớp nhân vật POSIX trong mẫu regex của tôi cho kết quả không mong muốn?
Đây là chương trình thử nghiệm của tôi:
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";
Nếu bạn chuyển sang regexp nhận xét ra bằng cách sử dụng [a-z], bạn sẽ có được bình thường, tự từ điển thứ tự sắp xếp. Tuy nhiên, Posix [: alpha:] lớp nhân vật mang lại một số thứ tự sắp xếp kỳ lạ-ass, như sau:
$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
đoán tốt nhất của tôi là tính chất giai cấp Posix được kích hoạt một số loại công cụ locale Tôi chưa bao giờ nghe nói và không yêu cầu. Tôi cho rằng phản ứng hợp lý với "bác sĩ, bác sĩ, nó đau khi tôi làm này!" là, "tốt, đừng làm rằng, sau đó!".
Nhưng, bất kỳ ai cũng có thể cho tôi biết điều gì đang xảy ra ở đây không và tại sao? Tôi đang sử dụng perl 5.10, nhưng tôi tin rằng nó cũng hoạt động theo perl 5.8.
Có một số lập trình viên, những người, khi phải đối mặt với sản lượng họ không mong đợi, có bản năng đầu tiên là yêu cầu * * Tôi đang làm gì sai? ** và tìm ra. Sau đó, có những người có bản năng đầu tiên là hỏi ** Trình biên dịch/phiên dịch làm gì sai? ** Những người trong danh mục thứ hai có thời gian khó viết mã tốt hơn. –
Lý do phổ biến nhất khiến mọi người nhận được hành vi bất ngờ là họ mong đợi điều sai trái. –