Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Patrón en cadena de caracteres
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Jue Ago 07, 2008 10:35 am
escanda
Perlero Nuevo
Perlero Nuevo
Registrado: 11 Jul 2008
Mensajes: 28
Patrón en cadena de caracteres Responder citando

Hola, ¿qué tal?. Como saben soy nuevo en esto, lo que estoy intentando hacer y necesito su ayuda, es contar la cantidad de comas que hay dentro de una variable ($frase), ¿cómo se puede lograr esto?

Gracias.
Saludos.
Mensaje Jue Ago 07, 2008 10:52 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4140
Ubicación: Valladolid, España
Responder citando

Pues... de varias formas...

La más fácil... con un bucle:

Perl:
#!/usr/bin/perl
use strict;
use warnings;

my $frase = "
En un lugar de la Mancha, de cuyo nombre no quiero acordarme, no ha mucho
tiempo que vivía un hidalgo de los de lanza en astillero, adarga antigua,
rocín flaco y galgo corredor. Una olla de algo más vaca que carnero, salpicón
las más noches, duelos y quebrantos los sábados, lentejas los viernes, algún
palomino de añadidura los domingos, consumían las tres partes de su hacienda.
El resto della concluían sayo de velarte, calzas de velludo para las fiestas
con sus pantuflos de lo mismo, los días de entre semana se honraba con su
vellori de lo más fino. Tenía en su casa una ama que pasaba de los cuarenta, y
una sobrina que no llegaba a los veinte, y un mozo de campo y plaza, que así
ensillaba el rocín como tomaba la podadera. Frisaba la edad de nuestro hidalgo
con los cincuenta años, era de complexión recia, seco de carnes, enjuto de
rostro; gran madrugador y amigo de la caza. Quieren decir que tenía el
sobrenombre de Quijada o Quesada (que en esto hay alguna diferencia en los
autores que deste caso escriben), aunque por conjeturas verosímiles se deja
entender que se llama Quijana; pero esto importa poco a nuestro cuento; basta
que en la narración dél no se salga un punto de la verdad."

;

my $hay_coma;
for (my $i = 0; $i < length($frase); $i++ ) {

    if (substr($frase,$i,1) eq ',') {
        $hay_coma++;
    }
}

print "Hay $hay_coma comas\n";

__END__

Otra forma: haciendo una transformación a nada:
Perl:
my $hay_coma = $frase =~ tr/,//;
Es decir, tr/// busca todas las comas y las cambia por nada (por lo que no hace nada), pero sí que, como valor añadido, nos devuelve el número de veces que lo ha hecho (que no ha hecho nada, quiero decir).

Otra forma: con una expresión regular:
Perl:
my $hay_coma = () = $frase =~ /,/g;
La expresión regular busca todas (/g) las comas, y las devuelve en contexto lista (()). Pero como al otro lado tenemos un escalar, obtenemos el número de comas encontradas. Escrito de otra manera más clara:
Perl:
my @hay_coma = $frase =~ /,/g;
my $hay_coma = @hay_coma;
Mensaje Vie Ago 08, 2008 7:00 am
escanda
Perlero Nuevo
Perlero Nuevo
Registrado: 11 Jul 2008
Mensajes: 28
Responder citando

explorer, gracias por la respuesta, pero he probado las 3 opciones dadas, y ninguna ha de funcionar, ¿se te ocurre alguna otra? ¿o algo que deba agregar para que ande?

Gracias.
Mensaje Vie Ago 08, 2008 8:20 am
teco000
Perlero Nuevo
Perlero Nuevo
Registrado: 29 May 2008
Mensajes: 33
Ubicación: Guatemala
Responder citando

A mí si me funcionaron. ¿Qué mensaje te sale?
Mensaje Vie Ago 08, 2008 8:22 am
escanda
Perlero Nuevo
Perlero Nuevo
Registrado: 11 Jul 2008
Mensajes: 28
Responder citando

Ningún error, solo que no me cuenta las comas, es como que no hace nada.
Mensaje Vie Ago 08, 2008 10:16 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4140
Ubicación: Valladolid, España
Responder citando

Sin ver el código, es difícil decir dónde falla.
Mensaje Vie Ago 08, 2008 12:45 pm
escanda
Perlero Nuevo
Perlero Nuevo
Registrado: 11 Jul 2008
Mensajes: 28
Responder citando

Ya logré que funcione lo de las comas, ahora lo que necesito es obtener parte de una frase.

Ejemplo : $frase = "perl.200443212.txt"

En ese caso deseo obtener todo el número, es decir, del punto al punto.

Gracias
Saludos.
Mensaje Vie Ago 08, 2008 2:59 pm
teco000
Perlero Nuevo
Perlero Nuevo
Registrado: 29 May 2008
Mensajes: 33
Ubicación: Guatemala
Responder citando

Perl:
#!/usr/bin/perl
use strict;
use warnings;

my $frase = "perl.200443212.txt";

$frase =~ m/\.(\d+)\./;
print"$1\n";
Mensaje Lun Ago 11, 2008 7:27 am
escanda
Perlero Nuevo
Perlero Nuevo
Registrado: 11 Jul 2008
Mensajes: 28
Responder citando

No me ha funcionado, ¿alguna otra opción?
Mensaje Lun Ago 11, 2008 9:35 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4140
Ubicación: Valladolid, España
Responder citando

Aquí tienes dos variantes:
Perl:
#!/usr/bin/perl -l

$frase = "perl.200443212.txt";

($numero) = $frase =~ /(\d+)/;
print $numero;

(undef, $numero, undef) = split(q{\.}, $frase);
print $numero;

__END__
Sale:
Código:
explorer@portatil:~/Documents/Desarrollo> ./kk.pl
200443212
200443212
Mensaje Lun Ago 11, 2008 10:34 am
escanda
Perlero Nuevo
Perlero Nuevo
Registrado: 11 Jul 2008
Mensajes: 28
Responder citando

Disculpa explorer, pero no me ha funcionado ninguna de las 2 opciones.
Mensaje Lun Ago 11, 2008 11:05 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4140
Ubicación: Valladolid, España
Responder citando

Entonces ha llegado el momento de que publiques tu código. A ciegas, es difícil hacer/decir nada.

Aquí no programamos utilizando las técnicas de Chuck Norris. Laughing
Mensaje Mar Ago 12, 2008 7:59 am
escanda
Perlero Nuevo
Perlero Nuevo
Registrado: 11 Jul 2008
Mensajes: 28
Responder citando

El problema que tengo es que me devuelve 1 o 0, dependiendo si lo que pregunto está o no, lo que necesito es que me devuelva esa parte.

ejemplo;
Perl:
$frase = hola.1231331.txt ( yo necesito 1231331)
my $partefrase = ( grep /\.(\d+)\./ , $frase)


Yo necesito que me devuelva el número, y me devuelve 1 en este caso.

Saludos
Mensaje Mar Ago 12, 2008 8:42 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4140
Ubicación: Valladolid, España
Responder citando

Se te olvidaron poner las comillas a hola.1231331.txt.

Si pones un código distinto al que te proponemos, es muy posible que no salga lo mismo...

Prueba con
Perl:
$frase = 'hola.1231331.txt';
my ($partefrase) = $frase =~ /(\d+)/;
print "$partefrase\n";


El valor de 1 que obtenías era el número de valores que grep() te devuelve. Sí: grep() dice que $frase tiene en su interior un patrón que corresponde con la expresión regular que le has pasado... pero NO extrae nada.
Mensaje Mie Ago 13, 2008 6:50 am
escanda
Perlero Nuevo
Perlero Nuevo
Registrado: 11 Jul 2008
Mensajes: 28
Responder citando

explorer, no puse las comillas ya que ese valor viene de otra función; lo puse como ejemplo.
Aun me sigue sin funcionar.
Saludos y gracias.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Ir a página 1, 2  Siguiente
Página 1 de 2



Powered by phpBB © 2001, 2005 phpBB Group