>> 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