>> Alf escribi�:

 > > Necesito un script que a paritr de un directorio recursivamente en
 > > todos los archivos con extensiones: *.shtml *.php *.js Encuentre el
 > > tag: <img src="PATH_e_imagen" width="XX" height="XX" border="X"
 > > alt="XX"> Y que me devuelva en correo o en un .txt los PATHS. es
 > > decir lo que iria en PATH_e_imagen

 hmm...

 > Aqu� va un script que puede hacer eso. Como siempre, no es la �nica
 > manera de lograr el cometido.

 de hecho... there's more than one way to do it ;-)

 Nada m�s por diversi�n, lo "mismo" en Perl.  El manejo de errores est�
 inclu�do.

#!/usr/bin/perl

use strict;
use warnings;
use File::Find;

my $dir = $ARGV[0] || '.';
undef $/;

find(sub {
    return unless (/\.(s?html|php|js)$/ and -f);
    open FILE, $_ or do { warn "No se puede abrir $_"; return };
    (my $html = <FILE>) =~ s/<!--.*?-->//g;
    while ($html =~ /<img\b[^>]+?\bsrc="(.*?)"[^>]*>/gi) {
        print $_, ": ", $1, "\n";
    }
}, $dir)

 Y para seguir el ejemplo de Alf, explicado l�nea por l�nea (tal vez
 convenzo a alguien de que Perl no es tan ilegible como se miente por
 ah�)

#!/usr/bin/perl

 Use Perl.

use strict;

 ... con sintaxis estricta.

use warnings;

 ... y d�game si algo raro sucede al ejecutarse el script.

use File::Find;

 ... y use File::Find porque nos interesa recorrer directorios
 recursivamente.

my $dir = $ARGV[0] || '.';

 El primer argumento es el directorio a abrir, o el directorio actual si
 no se especifica ninguno.

undef $/;

 elimine la definici�n actual de $/, el string que define lo que es una
 nueva l�nea cuando se leen archivos.  No es necesario hacer esto, pero
 permite emplear una expresi�n com�n en Perl, a saber:

    my $todo_el_archivo = <FILE>;

find(sub {
    ...
}, $dir)

 llama la funci�n "find", que toma como primer argumento una referencia
 a una rutina y el resto de los argumentos son los nombres de los
 directorios donde se debe buscar.  "find" llama la funci�n referida por
 el primer argumento para cada entrada en los directorios por los que
 camina.  Es en escencia lo mismo que el comando 'find'.

 "sub { ... }" declara una subrutina an�nima y lo interesante es lo que
 pasa en "...", es decir, el resto de la explicaci�n:

    return unless (/\.(s?html|php|js)$/ and -f);

 en espa�ol "det�ngase a menos que el nombre con el que se est�
 trabajando actualmente termine en .html, .shtml, .php o .js y que este
 corresponda a un archivo normal (no un link ni otra cosa parecida)".
 La construcci�n /.../ es un operador en Perl que eval�a una expresi�n
 regular con un string (en este caso el nombre del archivo).  La
 expresi�n en este caso busca un punto "\.", y alguno de los strings
 contenidos en la lista que sigue "(s?html|php|js)".  "s?html" es una
 forma m�s corta de escribir en este caso "shtml|html".  El "$" al final
 quiere decir que el string debe terminar all�, para evitar trabajar
 sobre cosas como "foo.html~" o "bar.php.bak".

    open FILE, $_ or do { warn "No se puede abrir $_"; return };

 abra el archivo llamado "$_" y avise en caso de que eso no sea posible.
 $_ est� definido por "find" y es el nombre del archivo actual.
 
    (my $html = <FILE>) =~ s/<!--.*?-->//g;

 Dos partes: 1. Lea todo el archivo gu�rdelo en $html.  2. Elimine los
 comentarios (cambiar esto para que elimine los comentarios de PHP o JS
 queda como ejercicio para el lector).  1. creo que es claro.  2. usa un
 operador en perl (s/string/reemplazo/), el string que busca es <!--
 algo --> que es como se declaran comentarios en HTML (no vaya a ser que
 algo est� comentado y nos pogamos a reportar que el archivo usa una
 imagen que en realidad no usa).  Los comentarios en HTML pueden abarcar
 m�s de una l�nea, pero debido a que tenemos *todo* el archivo en $html,
 no hay problema...

    while ($html =~ /<img\b[^>]+?\bsrc="(.*?)"[^>]*>/gi) {

 busque en todo (eso es la "g" al final de /.../) el texto "algo como"
 <img ... src="..." ...>, y por supuesto no nos interesa si es <IMG
 SRC=...> o <img src=...> o alguna variante enferma entre esas dos (eso
 es la "i" al final).  El resto de los detalles de la expresi�n regular
 me los ahorro, est�n all� para tomar en cuenta HTML v�lido que cumple
 con los requisitos expresados en el email original.  Lo �nico que vale
 la pena se�alar es que ese (.*?) captura el contenido de img="..." en
 la variable $1.
 
        print $_, ": ", $1, "\n";

 Imprima el nombre del archivo y su "src".

    }

 Fin del while... :-)

 "Share the magic,"

-- 
Marcelo


-- 
�Desea desuscribirse?  Escriba a [EMAIL PROTECTED] con el tema
'unsubscribe'.  M�s informaci�n: http://www.linux.or.cr/listas

Responder a