• Publicidad

length

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

length

Notapor juan » 2005-11-27 08:40 @403

Gracias por su ayuda, me sirvió un montón. ¿Y si quiero usar la función length() para contar los caracteres de una oración, pero sin considerar los espacios en blanco? Así, por ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print ": ingrese una oracion\n
  2. $oracion <STDIN>;
  3. chop $oracion;
  4. print lenght ($oracion)
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Uso lenght() y para que no cuente "\n" uso chomp() o chop(), pero para que no cuente los espacios en blanco, ¿¿puedo usar la función substr()??
juan
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2005-11-27 06:37 @317

Publicidad

Notapor explorer39 » 2005-11-27 09:05 @420

Sí puedes usar la función substr.

Tienes que hacer un bucle por toda la cadena de caracteres, encontrar los blancos, y quitarlos.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print ": ingrese una oración\n";
  2. $oracion = <STDIN>;
  3. chomp $oracion;
  4. for ($i=0; $i<length($oracion); $i++) {
  5.     if ( substr($oracion,$i,1) eq ' ' ) {
  6.         substr($c,$i,1) = "";
  7.         redo;
  8.     }
  9. }
  10. print lenght($oracion);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Aunque, desde luego, lo más sencillo es simplemente, contarlos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print ": ingrese una oración\n";
  2. $oracion = <STDIN>;
  3. chomp $oracion;
  4. $longitud=0;
  5. for ($i=0; $i<length($oracion); $i++) {
  6.     if ( substr($oracion,$i,1) ne ' ' ) {
  7.         $longitud = $longitud + 1;
  8.     }
  9. }
  10. print $longitud;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Otra forma sería utilizar las funciones de traducción, como la tr///:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print ": ingrese una oración\n";
  2. $oracion = <STDIN>;
  3. chomp $oracion;
  4. $oracion =~ tr/ //d;
  5. print lenght($oracion);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Y, finalmente, usar la función de sustitución, s///:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print ": ingrese una oración\n";
  2. $oracion = <STDIN>;
  3. chomp $oracion;
  4. $oracion =~ s/ //g;
  5. print lenght($oracion);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Con estas últimas opciones quitarías los blancos, pero si sólo quieres contarlos, te vale con la segunda solución, o, un truco como este: traducir todos los blancos por blancos y saber cuántas veces lo hemos hecho. A la longitud total de la cadena, le restamos ese valor, y tendremos la longitud menos lo que ocupan los blancos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print ": ingrese una oración\n";
  2. $oracion = <STDIN>;
  3. chomp $oracion;
  4. $blancos = $oracion =~ tr/ / /;
  5. print lenght($oracion) - $blancos;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer39 el 2005-11-27 12:58 @582, editado 3 veces en total
explorer39
 

Re: length

Notapor kidd » 2005-11-27 11:25 @517

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print ": ingrese una oración\n";
  2. $oracion = <STDIN>;
  3. chomp $oracion;
  4. $oracion =~ s/\s+//g;
  5. print lenght($oracion);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Solamente un pequeño cambio en la exp. reg.

SALUDOS
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor explorer39 » 2005-11-27 12:54 @579

He corregido dos fallos de las dos primeras soluciones.

En la primera hay que agregar un redo, ya que, al quitar el espacio en blanco, la longitud de la cadena cambia y, si dejamos que el bucle for continúe, hará que el índice $i apunte en realidad a dos caracteres más allá del último test. El redo reiniciará el bucle en donde estamos, con el mismo valor de $i, con lo que estaremos haciendo la búsqueda del espacio en blanco en el siguiente carácter al que hemos quitado.

En el segundo había otro error. Era 'ne' en lugar de 'eq' en la comparación.
explorer39
 

Notapor Perl user » 2005-11-28 02:16 @136

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use strict;
use warnings;

my $str = "Esta es una prueba de texto";
my $cnt = () = $str =~ /\w/g;
print $cnt; # 22
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Usar length() forzosamente para algo tan trivial como eso no tiene sentido.

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor explorer39 » 2005-11-28 06:15 @302

Perl user escribiste:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. my $str = "Esta es una prueba de texto";
  7. my $cnt = () = $str =~ /\w/g;
  8. print $cnt; #22
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Usar length forzosamente para algo tan trivial como eso no tiene sentido.

Saludos,
Bueno... porque estamos en el foro Básico... por eso le damos a Juan todas las combinaciones básicas que se nos ocurren... y length() es lo básico para sacar longitudes de cadenas.

Si estuviéramos en otro foro, haríamos cosas como esta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -le 'print"Esta es una prueba de texto"=~y/ //c'
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

:-)
explorer39
 

Notapor kidd » 2005-11-28 08:50 @410

Hola, el único problema que veo con la solución es que debido a que estamos en el idioma español me imagino que por ahí van a haber letras con acentos, por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $str = "Esto es una esdrújula";
  2. my $cnt = () = $str =~ /\w/g;
  3. print $cnt; # ¡Oops! 17
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Entonces se me ocurre atacar el problema desde otro punto de vista, que encuentre todo lo que NO sea espacio:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $str = "Esto es una esdrújula";
  2. my $cnt = () = $str =~ /[^ ]/g;
  3. print $cnt; # ¡YEY! 18
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y pues llegamos a la solución del problema original, contar todo de la oración que NO sea espacio.


SALUDOS
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor Perl user » 2005-11-28 13:56 @622

explorer39 escribiste:Bueno... porque estamos en el foro Básico... por eso le damos a Juan todas las combinaciones básicas que se nos ocurren... y length es lo básico para sacar longitudes de cadenas.
Si estuviéramos en otro foro, haríamos cosas como esta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -le 'print"Esta es una prueba de texto"=~y/ //c'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
:-)

Pero no hablo de buscar soluciones complejas, hablo simplemente de que length() se hizo para su objetivo, y calcular la cantidad de caracteres en una palabra ignorando espacios NO suena a un trabajo propio para length.

Nota: Enseñar técnicas y correcta utilización del lenguaje en un foro de principiantes tiene mucha más validez que enseñarlas a alguien con conocimientos arriba de las bases del lenguaje.

kidd escribiste:Entonces se me ocurre atacar el problema desde otro punto de vista, que encuentre todo lo que NO sea espacio:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $str = "Esto es una esdrújula";
  2. my $cnt = () = $str =~ /[^ ]/g;
  3. print $cnt; # ¡YEY! 18
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y pues llegamos a la solución del problema original, contar todo de la oración que NO sea espacio.


Bueno en realidad, si vamos a caracteres extraños, entonces estas ignorando que realmente los acentos hayan sido puestos con una distribución ASCII ( ISO-8859-1 o latin-1 o latin-15 ), o bien UTF-8, para UTF8 tu información podría ser errónea, por lo tanto tendrías que adoptar una exp. reg. que juegue con un patrón Unicode:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $str = "Esto es una esdrújula";
  2. my $cnt = () = $str =~ /\p{IsAlpha}/g;
  3. print $cnt; # 18
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Aquí pues, nuevamente mi punto fue inicialmente demostrar que intentar clavar cosas con un desarmador es complicado, de esta manera usar length() para algo tan trivial como es este ejemplo es ignorar las demás herramientas que te proporciona el lenguaje.

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor explorer39 » 2005-11-28 14:36 @650

Perl user escribiste:Pero no hablo de buscar soluciones complejas, hablo simplemente de que length se hizo para su objetivo, y calcular la cantidad de caracteres en una palabra ignorando espacios suena a NO un trabajo propio para length.
¡Cierto!

¿Te has dado cuenta, Juan, de la versatilidad de este lenguaje que permite hacer lo mismo de diez (y más) formas distintas?
explorer39
 

Notapor macgregor » 2005-11-30 10:07 @463

Perl user escribiste:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. my $str = "Esta es una prueba de texto";
  7. my $cnt = () = $str =~ /\w/g;
  8. print $cnt; #22
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Usar length forzosamente para algo tan trivial como eso no tiene sentido.


Después de leer varios mensajes, me gustaría que me explicaran la línea

my $cnt = () = $str =~ /\w/g;

Bueno, lo que realmente se escapa de mis conocimientos y no entiendo son los paréntesis :shock:

Un saludo y gracias :)
MACGREGOR [TM]
Avatar de Usuario
macgregor
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2004-12-09 07:32 @355
Ubicación: españa

Siguiente

Volver a Básico

¿Quién está conectado?

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