He encontrado algún comportamiento extraño de Perl: el uso de una clase de caracteres de Posix en una expresión regular altera por completo el orden de clasificación de las cadenas resultantes.¿Por qué el uso de una clase de caracteres POSIX en mi patrón de expresiones regulares da resultados inesperados?
Aquí es mi programa de pruebas:
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";
Si cambia al uso de [a-z] de la expresión regular comentado de salida, se obtiene el orden normal, lexicográfico. Sin embargo, el POSIX [: alpha:] clase de caracteres produce algún criterio de ordenación raro-culo, de la siguiente manera:
$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
Mi mejor conjetura es que la clase de caracteres POSIX es la activación de algún tipo de material local nunca he oído de y no solicitó. Supongo que la reacción lógica a "doctor, doctor, duele cuando lo hago este!" es, "bueno, no hagas que, entonces!".
Pero, ¿alguien puede decirme qué está pasando aquí, y por qué? Estoy usando Perl 5.10, pero creo que también funciona bajo Perl 5.8.
Hay algunos programadores, que, cuando se enfrentan con una producción que no esperaban, cuya primera reacción es preguntar * * ¿Qué estoy haciendo mal? ** y resolverlo. Luego, están aquellos cuyo primer instinto es preguntar ** ¿Qué está haciendo mal el compilador/intérprete? ** Los que están en la segunda categoría tienen más dificultades para escribir un buen código. –
La razón más común por la que las personas obtienen un comportamiento inesperado es que esperan algo equivocado. –