• Publicidad

Problemas con la letra Ñ

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problemas con la letra Ñ

Notapor Pablo3728 » 2010-03-28 14:38 @651

Buenas, tengo un problema al contar palabras de un texto y luego ordenarlas alfabéticamente. Utilizando el siguiente código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while (<>){
$linea = $linea.$_
}
while($linea =~ /([a-zA-Z]*)/g){
    $algo=$1;
    $algo=~ tr/A-Z/a-z/;
    exists ($hash{$algo}) ? ($hash{$algo}+=1) : ($hash{$algo}=1);
}
foreach my $llave (sort keys %hash){
  print "$llave: $hash{$llave}\n";
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El problema es que no incluye en mi solución las palabras que tienen la letra "ñ", he probado varias opciones pero sigue fallando, si alguien supiera alguna idea sería genial. Gracias :)

Pablo
Pablo3728
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2010-03-26 08:33 @398

Publicidad

Re: Problemas con la letra Ñ

Notapor explorer » 2010-03-28 14:42 @654

Mira este hilo anterior.

Mejor que usar [a-zA-Z], es \w, pero hay que hacer más cosas...

Luego, el código

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while (<>){
$linea = $linea.$_
}
while($linea =~ /([a-zA-Z]*)/g){
    $algo=$1;
    $algo=~ tr/A-Z/a-z/;
    exists ($hash{$algo}) ? ($hash{$algo}+=1) : ($hash{$algo}=1);
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

se puede dejar en:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while ($linea = <>) {
    while ($linea =~ /(\w+)/g){
        $hash{lc($1)}++;
    }
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El programa me queda así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use open ':locale';
  7.  
  8. open my $fichero, q[<], 'donquijoteparrafo1.txt';
  9.  
  10. my %hash;
  11.  
  12. while (my $linea = <$fichero>) {
  13.     while ($linea =~ /(\w+)/g){
  14.         $hash{lc $1}++;
  15.     }
  16. }
  17.  
  18. foreach my $llave (sort keys %hash){
  19.     print "$llave: $hash{$llave}\n";
  20. }
  21.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El tema principal está en el pragma open, para indicar que vamos a usar la localización de nuestro ordenador (no la de por defecto de Perl). Y \w será capaz de capturar los caracteres acentuados, eñe incluida.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problemas con la letra Ñ

Notapor erv-Z » 2010-03-28 19:12 @842

'ñ' no pertenece a la tabla de caracteres alfanuméricos, por lo tanto no lo tomará como un carácter alfanumérico...
info.

Lo que podrías hacer es usar la agrupación de carácter incluyendo a ñ...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$a = 'ñ';
if($a =~ m/[a-zñ]/){
print "Sí";
exit;
}
print "No";
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Resultado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Saludos.
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Re: Problemas con la letra Ñ

Notapor explorer » 2010-03-29 06:50 @326

erv-Z, estás confundido en varias cosas...

Primero, el sistema alfanumérico que has enlazado de la Wikipedia es un sistema numérico, como bien dice en la primera frase. NO tiene nada que ver con lo que se entiende como Alfanumérico: «Un término informático que hace referencia al conjunto de caracteres numéricos y alfabéticos de los cuales dispone una computadora. Tiene una correspondencia casi exacta con los caracteres que aparecen en un teclado de ordenador». Eso quiere decir que una letra, incluso la 'ñ', es un carácter alfanumérico. Y da igual que no esté en los alfabetos anglosajones: sí está en nuestro alfabeto latino occidental.

Lo que ocurre es que Perl, por defecto, aunque trabaja con iso-8859-1, y la 'ñ' está en la posición 241 y 209 (minúscula y mayúscula), es un carácter que solo es propio de las localizaciones latinas. Por eso hay que indicar a Perl la localización en la que estamos trabajando, y así saber cuáles son letras normales y cuáles no.

Segundo, en las expresiones regulares, con solo '[a-z]', estamos indicando solo ese rango, pero nada más. En cambio, tal como lo indica en perlre, cuando ponemos '\w' o '[:alnum:]' sí que estamos buscando por caracteres alfanuméricos según la localización que tengamos activa en ese momento.

He preparado un programa para que veas que la 'ñ' sí que es una letra alfanumérica:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. no locale;                      # Trabajar sin localización -configuración por defecto-
  7. print +(                        # Listado de los primeros 256 caracteres
  8.     sort grep /\w/,             # Nos quedaremos solo con los alfanuméricos
  9.     map { chr } 0..255
  10. ), "\n";
  11.  
  12.  
  13. use POSIX qw(locale_h);         # Vamos a indicar una localización
  14. setlocale(
  15.     LC_ALL,                     # Todas las opciones de localización serán cambiadas a
  16.     "es_ES.ISO-8859-1"          # Español, en alfabeto iso-8859-1
  17. )
  18. or die "Perdón";
  19.  
  20. use locale;                     # Indicamos que queremos usar nuestra localización
  21.                                 # en las próximas expresiones regulares
  22. print +(
  23.     sort grep /\w/,             # Nos quedaremos solo con los alfanuméricos
  24.     map { chr } 0..255
  25. ), "\n";
  26.  
  27. my $letra = chr 0xf1;           # Solo la 'ñ' en codificación iso-8859-1, la de por defecto de Perl
  28. es_alfanumerico( $letra );
  29.  
  30.  
  31. use utf8;                       # La 'ñ' que viene a continuación está escrita en un editor
  32.                                 # de textos con codificación utf-8, así que debemos indicar
  33.                                 # a Perl que lo que sigue no son dos bytes, sino un solo carácter
  34.  
  35. use open 'locale';              # A la hora de pintarlo, también queremos que salga como utf-8,
  36.                                 # ya que así también está la terminal en la que estamos trabajando
  37.  
  38. es_alfanumerico( 'ñ' );         # 'ñ' codificada dentro del programa (literal)
  39.  
  40.  
  41. es_alfanumerico( "\x{00F1}" );  # Codificación unicode de la 'ñ'
  42. es_alfanumerico( "\N{U+00F1}" );# Otra codificación unicode
  43.  
  44. use charnames ':full';          # Codificación de caracteres especiales mediante 'escapes'
  45.  
  46. es_alfanumerico( "\N{LATIN SMALL LETTER N WITH TILDE}" );  # Otra 'ñ'
  47. es_alfanumerico( "\N{VICTORY HAND}" );                     # ¡Victoria!
  48. es_alfanumerico( "\N{WHITE SMILING FACE}" );               # :)
  49.  
  50.  
  51. sub es_alfanumerico {
  52.     my $letra = shift;
  53.  
  54.     print "[$letra] ";
  55.  
  56.     if ($letra =~ m/\w/) {      # También valdría m/[[:alnum:]]/
  57.         print 'Sí';
  58.     }
  59.     else {
  60.         print 'No';
  61.     }
  62.     print "\n";
  63. }
  64.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

La salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz
_µÐð0123456789aAªáÁàÀâÂåÅäÄãÃæÆbBcCçÇdDeEéÉèÈêÊëËfFgGhHiIíÍìÌîÎïÏjJkKlLmMnNñÑoOºóÓòÒôÔöÖõÕøØpPqQrRsSßtTþÞuUúÚùÙûÛüÜvVwWxXyYýÝÿzZ
[ñ] Sí
[ñ] Sí
[ñ] Sí
[ñ] Sí
[ñ] Sí
[✌] No
[☺] No
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Observaciones:
  • En las líneas 6 a 10 es la configuración por defecto de Perl, y como puedes ver, el alfabeto de lo que él entiende como alfanumérico es justo [0-9A-Z_a-z], todo muy inglés...
    .
  • De las líneas 13 a 25 indicamos que vamos a trabajar con el alfabeto ISO-8859-1 -el de por defecto de Perl-, PERO con la localización española ('es_ES'). El resultado es la segunda línea de la salida: un montón de caracteres más se han sumado a la familia de los alfanuméricos. Incluso están las abreviaturas primero (º) y primera (ª).
    .
  • En la línea 28 probamos exclusivamente con una cadena de caracteres que contenga solo un byte 0xf1 (la codificación de 'ñ' en iso-8859-1. Como es la que estamos usando en este momento, pues nos indica que sí, que es alfanumérico.
    .
  • Las líneas 31 a 38 pueden ser algo complicadas de entender para quien no sepa lo que es trabajar con distintas codificaciones. Resulta que yo, desde hace ya unos pocos años, trabajo en mis máquinas con codificación utf-8, tanto en terminales como en editores de texto y los ficheros que generan. El programa anterior lo estoy escribiendo en un editor con codificación utf-8. Si, dentro del programa, escribo, literalmente, una 'ñ', estaré escribiendo una cadena de texto con dos bytes (0xc3 y 0xb1) que codifican a la eñe en la codificación utf-8, pero Perl NO LO SABE. Para Perl, son dos bytes que codifican a dos caracteres, ya que sigue trabajando por defecto en la ISO-8859-1. Debo advertir a Perl que lo que va a ver a continuación no son dos bytes, sino solo un carácter, codificado en utf-8. La línea 31 indica eso: que los bytes que va a encontrar en las cadenas de texto estarán en utf-8. Y la línea 35 indica que, a la hora de imprimir esos caracteres, lo haga en la localización que indique el sistema (el sistema está puesto a es_ES.UTF-8), por lo que Perl no emitirá caracteres en ISO-8859-1, sino en utf-8.
    .
  • Las líneas 41 a 48 es para mostrar otra forma de indicar caracteres especiales, también en Unicode.

Resumen: Nuestra eñe será alfanumérica si Perl sabe en qué parte del planeta estamos trabajando.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problemas con la letra Ñ

Notapor erv-Z » 2010-03-29 09:00 @416

Sí, tienes razón xD.
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados