• Publicidad

Indexar todas las palabras encontradas en un texto

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

Indexar todas las palabras encontradas en un texto

Notapor bartg01 » 2007-11-30 06:34 @315

Mi script encuentra el número de ocurrencias de una palabra en un archivo de texto, pero a la hora de mostrarme dónde se encuentran no consigo que asigne su index a cada ocurrencia, sino que me aparece el mismo index para todas ellas.

¿Podría alguien ayudarme?
bartg01
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2007-11-29 16:15 @718

Publicidad

Notapor Norther » 2007-11-30 07:33 @356

Pon el código, quizás así sea más sencillo ver dónde tienes el error.
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor bartg01 » 2007-11-30 11:19 @513

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
for my $claves (@claves) {
    my @coord = ();
    my $cuantos=0;
    my $i=0;
    for ($seqst =~ m/$claves/ig) {
        $cuantos++;
        for $i ($cuantos) {
            my $pos = index ($seqst,$claves);
            my $long = length ($claves);
            my $posi = $pos+1;
            my $longi = $posi+$long;
            my $coord = "($posi - $longi)";
            push (@coord, $coord);
        }
    }
             
    if ($seqst =~ m/$claves/i) {
        print RESULT "$claves:$cuantos @coord\n";
    }
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
bartg01
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2007-11-29 16:15 @718

Notapor explorer » 2007-11-30 15:11 @674

Hay demasiado código para hacer eso...

Esto es muy raro: for $i ($cuantos) {: estás haciendo un bucle por un solo número. Otra cosa: ¿para qué sirve la variable $i?. Haces dos veces la comprobación con la misma expresión regular, y veo que la segunda no se debería ejecutar nunca, pues todas habrán sido capturadas en la expresión regular del for. Otra cosa: no hay que usar for con una expresión regular. Es mejor usar while.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor bartg01 » 2007-11-30 15:14 @676

Gracias por la respuesta pero ya lo he solucionado, introduciendo una ventana con substr.
bartg01
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2007-11-29 16:15 @718

Notapor explorer » 2007-11-30 16:14 @718

Aquí está mi solución:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
for my $clave ( @claves ) {
    my @coordenadas;

    while ( $texto =~ m/$clave/ig ) {

        my $lugar = 1 + pos $texto;
        my $largo = length $clave;

        push @coordenadas, '(' . $lugar . ' - ' . ($lugar + length($clave)) . ')';
    }

    if ( @coordenadas ) {
        print "$clave:", scalar @coordenadas, " @coordenadas\n";
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2007-12-07 20:50 @910, editado 1 vez en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor bartg01 » 2007-11-30 16:20 @722

¿Existe una función pos() en Perl?

Yo lo he conseguido hacer con index y substr, aunque si realmente funciona para varias palabras es mucho mas sencillo.

Ahora no tengo tiempo para redactar el script. Si te parece te lo cuelgo mañana aquí para que puedas opinar, que ahora ando pillado de tiempo y tengo que salir volando.

ok, :-)
bartg01
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2007-11-29 16:15 @718

Notapor bartg01 » 2007-11-30 16:30 @729

Me da no sé qué dejarte con la intriga ;-)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
for my $claves (@claves) {
             my @coord=();
             my $cuantos=0;
             my $posf=0;
                for ($seqst =~ m/$claves/ig) {
               
                   my $ventana = substr ($seqst,$posf);
                   my $seqstc = length ($seqst);
                   my $cadenac = length ($ventana);
                   my $cortado = $seqstc-$cadenac;
                   
                   
                      if ($ventana =~ /$claves/i) {
                         my $long = length ($claves);
                         my $pos = index ($ventana,$claves);
                         my $posi = $pos+$cortado;
                         $posf = $pos+$long+$cortado;
                         my $coord = "($posi pb - $posf pb)";
                         push (@coord, $coord);
                      }
                     
                   $cuantos++;
                   
                }
             if ($seqst =~ m/$claves/i) {
               print RESULT "$claves:$cuantos @coord\n";
             }
         }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Es un poco caos pero es lo único que se me ha ocurrido.
bartg01
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2007-11-29 16:15 @718

Notapor explorer » 2007-11-30 17:49 @784

pos() devuelve la posición donde se encontró la $clave dentro del $texto (la posición donde se encontró en la expresión regular).

No es comparable a index(), que es para buscar una cadena dentro de otra.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

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

cron