2010-04-24 8 views
5

¿Gano algo cuando transformo mi $url de esta manera: $url = URI->new($url)?¿Qué gano al filtrar las URL a través del módulo URI de Perl?

#!/usr/bin/env perl 
use warnings; use strict; 
use 5.012; 
use URI; 
use XML::LibXML; 

my $url = 'http://stackoverflow.com/'; 
$url = URI->new($url); 

my $doc = XML::LibXML->load_html(location => $url, recover => 2); 
my @nodes = $doc->getElementsByTagName('a'); 
say scalar @nodes; 

Respuesta

3

El módulo URI como varios beneficios:

  • Se normaliza la dirección URL para usted
  • Se puede resolver URL relativos
  • Puede detectar direcciones URL no válidos (aunque es necesario desactivar los bits schemeless)
  • Puede filtrar fácilmente las URL que desea procesar.

La ventaja que obtiene con el poco código que muestra es mínima, pero a medida que continúa trabajando en el problema, quizás explorando el sitio, URI se vuelve más útil a medida que selecciona qué hacer a continuación.

+0

"Puede detectar URL inválidas (aunque debe desactivar los bits sin esquema)" - Me gustaría hacer eso, pero ¿cómo? He encontrado que el constructor de URI es muy liberal en lo que se espera, lo que puede deberse a que trata muchos esquemas. Estoy buscando algo para validar una URL HTTP/S. Debería ser fácil escribir algo que haga el trabajo, pero odiaría reinventar la rueda cuando el módulo 'URI' está ahí para hacer el trabajo por mí. – Lumi

1

me sorprende que nadie ha mencionado todavía, pero $url = URI->new($url); no limpia su $url y la mano de nuevo a usted, se crea un nuevo objeto de la clase URI (o, más bien, de uno si sus subclases), que puede pasar a otro código que requiere un objeto URI. Esto no es particularmente importante en este caso, ya que XML::LibXML parece estar contento de aceptar ubicaciones como cadenas u objetos, pero algunos otros módulos requieren que les dé un objeto URI y rechazará las URL presentadas como cadenas simples.

+0

Bueno, no lo mencioné porque está implícito que un constructor te está devolviendo un objeto. Sin embargo, este objeto tiene demasiada sobrecarga de cadena, por lo que también puede tratarlo como una cadena. –

Cuestiones relacionadas