2010-04-24 68 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