Las posiciones de los caracteres dentro de una cadena se numeran de la misma manera que los índices de los arreglos: desde cero. Por eso, tus operaciones de búsqueda devuelven un 4: porque la expresión se ha encontrado en la quinta posición.
Esta es una versión más simplificada: usa la función pos() para saber dónde ha terminado la expresión encontrada, usa
$& para saber qué expresión se ha encontrado, y se hace un bucle while() con la expresión regular, junto con el modificador
/g, para que repita la búsqueda por toda la secuencia. Fíjate cómo, además, añado un
+1 para pasar a posiciones reales (basadas en 1, no en 0). Y un detalle cuando se pinta el aviso de que no se ha encontrado: se usa un
and para concatenar (y ejecutar) dos acciones si se cumple la condición.
Atención que en tu código hay un posible error: has puesto la secuencia como varias líneas de texto. Podría darse el caso de que quieras buscar por una expresión que se encontrase entre dos líneas -por ejemplo, OIOU-. Si no ponemos la expresión regular de la línea 12 que une todas las líneas en una sola, nos dirá que no aparece, pero con ella, nos indica que está en la posición 81.
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
my $sec = 'SXRDCTFFFFFYVGUBHNJKLFVNLAISUBNLASDIUV
ÑSDVFNÑASNVÑAJSDBNÑFOIVABNÑSDFVBGÑASOI
OUIBHVDUIOAEIRVCTFFFFFFFFFBIÑSDAUBGPEWIUBVÑWEOPINGVÑER
EOVUNHOWUIGNÑVWUvÑBNVPIUWBNVIPUWBPIVÑBN
DUIVOWPIER';
$sec =~ s/\n//g; # Unimos todas las líneas
while (1) {
print "Introduzca la expresión regular a buscar: ";
chomp(my $expr = <>);
last if $expr =~ /^$/; # Salimos con un 'enter'
print "No aparece\n" and next if $sec !~ /$expr/;
while ($sec =~ /$expr/gi) {
my $fin = pos($sec) + 1;
my $inicio = $fin - length $&;
print "$inicio\t$fin\t$&\n";
}
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
No obtienes un valor cuando buscas por
CTF{3,} porque estás usando la función index(), que no sirve con expresiones regulares. Solo funcione con cadenas de texto. Por eso, con
CTF sí que funciona. Con
CTF{3,} está buscando exactamente eso (incluidas las llaves).
Otra forma de escribir una secuencia larga de caracteres, sin los retornos de carro, puede ser así, usando el operador de concatenación:
Using perl Syntax Highlighting
my $sec
= 'SXRDCTFFFFFYVGUBHNJKLFVNLAISUBNLASDIUV'
. 'ÑSDVFNÑASNVÑAJSDBNÑFOIVABNÑSDFVBGÑASOI'
. 'OUIBHVDUIOAEIRVCTFFFFFFFFFBIÑSDAUBGPEWIUBVÑWEOPINGVÑER'
. 'EOVUNHOWUIGNÑVWUvÑBNVPIUWBNVIPUWBPIVÑBN'
. 'DUIVOWPIER'
;Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4