Bienvenido a los foros de Perl en español, Kreator69.
Para buscar cadenas literales, mejor y más rápido usar index() (o rindex()).
Aquí tienes un ejemplo:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use utf8;
use open qw(:utf8 :std); # Terminal en modo utf8
my $seq = 'GGGTAGGCTAGGATCGGGTACGTCACGGGTATGCA';
my $s = 'GG';
my $pos = 0;
my $n = 0;
while (($pos = index($seq, $s, $pos)) != -1) { # Buscamos $s en $seq a partir de $pos
# print "Encontrado en posición $pos\n";
$n++; # Contador de veces
$pos++; # Avanzamos a la siguiente letra
}
print "SE HAN ENCONTRADO $n VECES ESTE STRING ($s) EN LA SECUENCIA.\n";
__END__
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
El programa inicia un bucle, ejecutando index() en la secuencia, buscando por $s, la cadena que queremos buscar, y desde la posición $pos (inicialmente, 0, la primera letra). El resultado de index() es la posición donde se encuentra la cadena encontrada, o -1 si no ha encontrado nada. Ese resultado lo almacenamos en $pos, para la siguiente vuelta (comenzar a buscar desde el sitio donde se encontró la última cadena). Además, aprovechamos para comprobar si es un -1 lo que nos ha devuelto index(), marcando que no ha encontrado ninguna más.
Dentro del bucle, contamos una aparición más, y movemos $pos una posición más allá, ya que sino, index() buscaría la cadena en la misma posición en la que encontró la última, por lo que estaríamos en un bucle sin fin (siempre nos devolvería el mismo resultado).
Otra forma, más abreviada, después de un poco de matemáticas, es:
Using perl Syntax Highlighting
#!/usr/bin/perl
my $seq = 'GGGTAGGCTAGGATCGGGTACGTCACGGGTATGCA';
my $s = 'GG';
my $pos = 0;
my $n = 0;
$n++ while $pos = 1 + index($seq, $s, $pos);
print "SE HAN ENCONTRADO $n VECES ESTE STRING ($s) EN LA SECUENCIA.\n";
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Más información en
perldoc -f index.