Claro que salen errores...
si quitas módulos, es muy posible que salgan errores
Instalar módulos, en Perl, es bastante sencillo... No lleva mucho tiempo. Y algunos ahorran mucho trabajo. Fíjate que el programa se queda corto.
Lo que sí tiene que quedar claro, es que estamos en el foro Intermedio, así que, yo aquí, uso técnicas avanzadas (bueno, no demasiadas; no es el foro Avanzado
)
La expresión regular se puede escribir así, con espacios y separada en líneas, gracias a la opción
/x.
Una cosa que a lo mejor no te funciona, son las capturas con nombre:
(?<nombre>...), que sólo funcionan a partir de Perl v5.10.
El módulo Modern::Perl activa varias opciones. Una de ellas es la
use feature ':5.10';
que activa las opciones nuevas de Perl v5.10; entre ellas, la sentencia say().
Y, bueno, usar utf8 te permite usar caracteres acentuados en los nombres de las variables. Por eso, puedo poner $página, en lugar de $pagina.
Un detalle importante... yo he creado mi programa en un entorno utf8 (en mi Linux). El "use open qw(:utf8 :std);" indica que la entrada estándar del programa (que no usamos) y la salida estándar (que sí usamos con el say()) deben salir los caracteres en esa codificación.
Necesitamos el módulo Encode porque la página que descargamos viene en esa codificación.
(Bueno, ahora que lo pienso, quizás no haga falta la línea 14, ya que en la 24 ya indicamos que el $contenido está en utf8.
Edito: confirmado: el módulo Encode se puede ahorrar.)
El truco está en la línea 22. La variable
$/ es el delimitador de los registros de entrada. Ahí podemos decir qué separan a unos registros de otros. En este caso, ponemos el comienzo de <div>, por lo que Perl se encargará de darnos las entradas, partiendo el $contenido por ese valor.
La línea 24, para mí, es un hito: es la primera vez que "abro" una variable escalar como si fuera un fichero (con open()). Lo aprendí hace poco, y en algunas situaciones, como esta, es muy útil.
La expresión regular de la línea 29 separa los componentes con espacios en blanco y en líneas separadas, gracias a
/x como he dicho antes. Por eso, en la primera línea de la exp. reg. hay un "[ ]" porque ese espacio sí que es significativo para el patrón (no separa partes del patrón, sino que forma parte del propio patrón, de lo que estamos buscando). El resto de la exp. reg. no tiene misterio: siempre usamos
.+? para buscar y/o capturar.
De hecho... he complicado demasiado el programa...
Se puede reducir a esto:
Using perl Syntax Highlighting
#!/usr/bin/perl
use LWP::Simple;
my $web = get('http://www.inmuxxxxxxxtina.com.ar/casas-en-venta-174');
while ($web =~ m{<h2><a href="(.+?)">(.+?)<.+?<p>\s*(.+?)\s*<.+?class='d'>\s*(.+?)<.+?<a.+?>(.+?)<.+?class="price-list">\s*(.+?)\s*<}gs) {
print "URL: [$1]\n";
print "Título: [$2]\n";
print "Descripción: [$3]\n";
print "Fecha: [$4]\n";
print "Categoría: [$5]\n";
print "Precio: [$6]\n\n";
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Bueno, al menos hemos aprendido cosas nuevas.