2010-04-24 60 views
5

當我變換我的$url時,我會獲得些什麼:$url = URI->new($url)通過Perl的URI模塊過濾URL可以獲得什麼?

#!/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; 

回答

3

URI模塊幾個好處:

  • 它標準化的URL,你
  • 它可以解決相對URL
  • 它可以檢測無效的網址(雖然你需要關閉schemeless位)
  • 您可以輕鬆過濾要處理的URL。

您獲得的一小部分代碼所帶來的好處是最小的,但是隨着您繼續解決該問題,可能會使站點變得臃腫,在選擇接下來要做的事情時,URI變得更加方便。

+0

「它可以檢測到無效的URL(儘管你需要關閉無方位的位)」 - 我想這樣做,但是怎麼做?我發現URI構造函數在它期望的時候非常自由 - 這可能是因爲它處理了很多方案。我正在尋找驗證HTTP/S URL的東西。應該很容易寫出能夠完成這項工作的東西,但是當'URI'模塊在那裏爲我推出工作時,我不想重新發明輪子。 – Lumi 2011-06-21 16:26:23

1

我很驚訝還沒有人提到這個問題,但$url = URI->new($url);沒有清理$url並交回給你,它會創建URI類的新對象(或者,更確切地說,一個如果它的子類的),這然後可以傳遞給需要URI對象的其他代碼。在這種情況下,這並不特別重要,因爲XML::LibXML似乎很樂意接受位置爲字符串或對象,但其他一些模塊要求您給它們一個URI對象,並會拒絕呈現爲普通字符串的URL。

+0

嗯,我沒有提到它,因爲它暗示着一個構造函數正在給你一個對象。然而,這個對象已經被重載,所以你也可以像處理一個字符串一樣對待它。 – 2010-04-26 19:02:41