Bienvenido a los foros de Perl en español, crawler.
Aquí hay varios problemas...
¿Qué método usas para realizar la búsqueda?
No nos lo dices, pero podemos hacer algunas suposiciones.
Para saber si un texto está dentro de otro, se suele usar (normalmente):
- el operador lógico 'eq'
- la función index() (o la rindex())
- una expresión regular
Nos comentas que estás dividiendo el texto por los espacios, así que sospecho que estás usando el primer método, el del 'eq'. El problema está en que hay poblaciones con más de una palabra.
Lo podrías resolver complicando un poco más la estructura de datos, buscando por todas las palabras que componen cada población, ampliando el
hash, y por cada población, además, saber cuántas palabras lo forman. Pero es que además, deberías llevar el control de si las palabras encontradas están juntas y en el orden adecuado. Desde luego, sería muy complicado, pero con esta solución podrías localizar poblaciones que están escritas "al revés", como por ejemplo,
Bisbal d'Empordà, La (solo cambia una palabra de sitio, para dar más importancia a
Bisbal).
Otra solución. Con index() puedes buscar si un texto está dentro de otro, y te devuelve la posición (empezando en 0) en donde se encuentre.
Using perl Syntax Highlighting
#! /usr/bin/perl
use common::sense; # Hay que tener sentido común
#use Modern::Perl; # Somos modernos
#use autodie; # es mejor morir que regresar con deshonor (proverbio Klingon)
#use utf8; # este programa está escrito en utf8
use open qw(:utf8 :std); # la salida y la entrada estándar serán en utf8
my $texto = "
Reus es una población de Cataluña, de Reus
La Bisbal d'Empordà jhf sdkjfh sakdlfh sdkfh skhf sdkf dkjfh
sdlkjfh sdlkjfh slkjfh sdklfjh sklfjh sdklfjh sdkjfh sdkfh
ksdf kdjfh sdkfh sf El Vendrell fjdh fskdjfh skdjfh ksdjfh
Gironaslkfj lkjf lskjf lsdkjf sdljf La Bisbal d'Empordà
sldfj ljflsdkjf ";
my @poblaciones = (
'Reus', 'Girona', 'Sabadell',
"La Bisbal d'Empordà", 'El Vendrell',
);
for my $población (@poblaciones) {
my $pos = 0;
while($pos = index($texto, $población, $pos) + 1 ) {
print "Población $población encontrada en posición $pos\n";
}
}
__END__
Población Reus encontrada en posición 2
Población Reus encontrada en posición 40
Población Girona encontrada en posición 224
Población La Bisbal d'Empordà encontrada en posición 45
Población La Bisbal d'Empordà encontrada en posición 260
Población El Vendrell encontrada en posición 185
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
Funciona, pero siempre y cuando las poblaciones estén escritas de
la misma manera en que las tienes definidas en el
array.
Pero no es perfecto. Fíjate que ha encontrado 'Girona', pero está "pegada" a la palabra que le sigue: index() no sabe distinguir entre palabras y espacios. Solo busca cadenas de caracteres. Y en algunos casos no nos servirá.
Otra solución, usando expresiones regulares.
Using perl Syntax Highlighting
#! /usr/bin/perl
use common::sense; # Hay que tener sentido común
#use Modern::Perl; # Somos modernos
#use autodie; # es mejor morir que regresar con deshonor (proverbio Klingon)
#use utf8; # este programa está escrito en utf8
use open qw(:utf8 :std); # la salida y la entrada estándar serán en utf8
my $texto = "
Reus es una población de Cataluña, de Reus
La Bisbal d'Empordà jhf sdkjfh sakdlfh sdkfh skhf sdkf dkjfh
sdlkjfh sdlkjfh slkjfh sdklfjh sklfjh sdklfjh sdkjfh sdkfh
ksdf kdjfh sdkfh sf El Vendrell fjdh fskdjfh skdjfh ksdjfh
Gironaslkfj lkjf lskjf lsdkjf sdljf La Bisbal d'Empordà
sldfj ljflsdkjf sabadell df slkjf slfj El vendrell
LA BISBAL D'EMPORDÀ Y REUS";
my @poblaciones = (
'Reus', 'Girona', 'Sabadell',
"La Bisbal d'Empordà", 'El Vendrell',
);
for my $población (@poblaciones) {
while ($texto =~ /\b$población\b/gsmi) {
print "Población $población encontrada en posición ", pos($texto), "\n";
}
}
__END__
Población Reus encontrada en posición 5
Población Reus encontrada en posición 43
Población Reus encontrada en posición 356
Población Sabadell encontrada en posición 303
Población La Bisbal d'Empordà encontrada en posición 63
Población La Bisbal d'Empordà encontrada en posición 278
Población La Bisbal d'Empordà encontrada en posición 349
Población El Vendrell encontrada en posición 195
Población El Vendrell encontrada en posición 329
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Fíjate, que además de encontrar todas las posiciones anteriores, podemos:
- saber cuándo es una palabra separada de las demás (Girona ya no se encuentra, porque en el texto aparece como Gironaslkfj)
- no importa si está escrito en mayúsculas o no (última línea del $texto) o mezclado (el caso de "El vendrell")
Yo te recomiendo que mires esta opción de usar expresiones regulares (aparte que es muy sencilla: solo buscamos por $población, separada del texto del $texto por
\b, que marca los límites de una palabra. Y la buscamos independientemente de si está en mayúsculas o no (
/i).
Atento a la codificación de caracteres que estés usando... eso también influye.