Falta un '=' después del HREF....
Es siempre más cómodo buscar lo menos posible que coincida con lo que buscamos.
Si se trata de buscar los enlaces dentro de la línea, sabemos -mirando el fichero de bookmarks- que todos esos enlaces están entrecomilladas. Como además en la misma línea puede haber más de una cadena de caracteres entrecomilladas, tenemos que buscar qué es lo que distingue al enlace del resto. Y lo distinto es lo que hay justo delante de él:
HREF=. Bueno, pues eso buscaremos:
- Código: Seleccionar todo
foreach $linea (@fichero_original) {
if ( $linea =~ m/HREF="(.*?)"/ ) {
$fichero_limpio[$i++] = $1;
}
Es decir, buscamos
HREF=", nos quedamos con lo del medio hasta la próxima
".
Hay que tener mucho cuidado con las expresiones [url].*[/url], ya que son 'glotonas', es decir, que intentan encajar la expresión regular con todos los caracteres posibles, no con la primera coincidencia.
Ejemplo: supongamos que tenemos esto:
- Código: Seleccionar todo
$linea = ' <A HREF="http://www.enlace.com/" date="1212111111">';
$linea =~ m/HREF="(.*)".*$/;
print $1; # http://www.enlace.com/" date="1212111111
La salida nos sale mal... ya que el primer
.* nos captura todo lo posible y, aunque ponemos la segunda comilla doble como intento de parada, el
.* glotón se da cuenta de que hay más comillas en el resto de la línea. Continúa y vé que efectivamente puede hacer coincidir el patrón con la última comilla doble, la de la fecha. De ahí la salida mal. El segundo
.*$ sólo sirve para perder tiempo, pues de sobra sabemos que habrá caracteres entre lo que queremos y el final de línea. Lo mismo podríamos decir de un '
^.*'. ¡Ojo! Esto no quiera decir que no sean útiles en otras circunstancias.
Necesitamos que el
.* glotón se pare cuanto antes coincida el patrón regular. Poniendo
$linea =~ m/HREF="(.*?)"/;la captura ya es la que queremos: el '
?' hace que desaparezca la glotonería del
.*. Se parará justo antes de la siguiente comilla doble, que es lo que queremos.
La forma de captura, en vez de
.*? podría haber sido la tradicional
[^"]* (buscamos 0 o más caracteres que no sean una comilla doble). Quizás es mucho más clara para una persona que empieza con esto de las expresiones regulares. Quedaría:
- Código: Seleccionar todo
if ( $linea =~ m/HREF="([^"]*)"/ ) {
$fichero_limpio[$i++] = $1;
}