2010-04-24 5 views
5

Guadagno qualcosa quando trasformo il mio $url in questo modo: $url = URI->new($url)?Cosa guadagno filtrando gli URL tramite il modulo URI di 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; 

risposta

3

Il modulo URI come diversi vantaggi:

  • normalizza l'URL per voi
  • E 'in grado di risolvere gli URL relativi
  • E' in grado di rilevare gli URL non validi (anche se è necessario disattivare i bit schemeless)
  • È possibile filtrare facilmente gli URL che si desidera elaborare.

Il vantaggio che si ottiene con quel poco di codice che si mostra è minimo, ma man mano che si continua a lavorare sul problema, magari spidering del sito, l'URI diventa più pratico quando si seleziona cosa fare dopo.

+0

"Può rilevare URL non validi (anche se è necessario disattivare i bit senza schema)" - Mi piacerebbe farlo, ma come? Ho trovato che il costruttore di URI è molto liberale in ciò che si aspetta - il che potrebbe essere dovuto al fatto che riguarda molti schemi. Sto cercando qualcosa per convalidare un URL HTTP/S. Dovrebbe essere facile scrivere qualcosa che faccia il lavoro, ma odio reinventare la ruota quando il modulo 'URI' è lì per fare il lavoro per me. – Lumi

1

Mi sorprende che nessuno ha parlato ancora, ma $url = URI->new($url); non pulisce il vostro $url e consegnarlo di nuovo a te, crea un nuovo oggetto della classe URI (o, meglio, di uno se le sue sottoclassi), che può quindi essere passato ad un altro codice che richiede un oggetto URI. Ciò non è particolarmente importante in questo caso, dal momento che XML::LibXML sembra essere felice di accettare posizioni come stringhe o oggetti, ma alcuni altri moduli richiedono di assegnare loro un oggetto URI e rifiuteranno gli URL presentati come semplici stringhe.

+0

Beh, non l'ho menzionato perché è implicito che un costruttore ti restituisca un oggetto. Questo oggetto, tuttavia, ha sovraccarico le stringhe, quindi puoi anche trattarlo come una stringa. –

Problemi correlati