2012-02-11 44 views
5

我需要在Perl程序中处理一些HTTP URL,但我怀疑URI类应该如何帮助我。我应该如何使用Perl URI类?

特别是,我想使用URI类来解析相对URL并获取它们的组件。然而,问题是:

  1. 我需要一个函数来既URI对象和URI字符串作为参数的工作(或确保只有一个被传递)

    sub foo_string_or_url { 
        my $uri = URI->new(shift); 
    

    是正确的做法?我不太喜欢它,因为它将URI串联起来,并不必要地创建新的对象。

  2. 提取物成分

    my $host = $uri->host; 
    

    这也是有问题的,因为不是所有的URI■找主持人,特别是,如果有人通过垃圾的功能,这将die()

  3. 解析相对URL

    my $new_url = URI::URL->new($uri, $base)->abs; 
    

    IIUC,没有->abs,结果仍将字符串化的相对URL(而不会为HTTP::Request的工作),对吗?此外,这是保证返回URI

我应该如何处理这些问题?这种可能性是

  • 使用->isa('URI')->can("host")
    • 似乎容易出错,丑对我所有的时间
  • 不要使用URI类在所有使用正则表达式
    • 解析网址我宁愿使用一个库解决方案,而不是调试我自己的
  • try { ... } catch { ... }
    • URI操作见第一点

是否有使用URI类的理智,很简单的方法?我没有想过的简单东西(在上面的列表中)?

回答

7

我认为你的问题可以总结:参数验证是乏味的,我该怎么办呢?

  1. 我也不喜欢它。这是开发商之间不同意见的问题,其他人认为强制比切片面包更好,尤其是当由穆斯自动完成时。我认为只允许一种简化程序。此外,YAGNI适用于绝大多数情况。如果拒绝错误类型,请使用帮助器模块,例如Params::Validate/MooseX::Method::Signatures/MooseX::Declare以避免您的代码示例中显示的手动检查。

  2. 这是所需的行为。异常处理机制让你可以编写适合每种情况的自定义代码。如果您认为它不美观,请将其删除,并介意让异常不受限制的后果。

    use Try::Tiny; 
    my $host; 
    try { 
        $host = $uri->host; 
    } catch { 
        warn "Could not determine host for $uri. Message was: $_. Retry/abort/ignore?\n"; 
        … 
    }; 
    
  3. 是的,是的。

+3

唯一没有回答的问题是“我应该如何处理这些问题?”,答案是“总是调用abs”。如果您已经拥有绝对URI,它将不会执行任何操作。 – ikegami 2012-02-11 21:02:10

相关问题