我应该如何使用Perl URI类?

我应该如何使用Perl URI类?,perl,oop,url,Perl,Oop,Url,我需要在Perl程序中处理一些HTTP URL,但我怀疑该类应该如何帮助我 特别是,我希望使用URI类来解析相对URL并获取它们的组件。然而,问题是: 我需要一个函数来处理URI对象和URI字符串作为参数(或者确保只传递一个) 这是正确的方法吗?我不太喜欢它,因为它将URI字符串化,并不必要地创建新对象 提取成分 my $host = $uri->host; 这也是有问题的,因为并非所有的URI都有主机,特别是如果有人将垃圾传递给函数,这将die() 解析相对URL my $new_ur

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

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

  • 我需要一个函数来处理
    URI
    对象和URI字符串作为参数(或者确保只传递一个)

    这是正确的方法吗?我不太喜欢它,因为它将
    URI
    字符串化,并不必要地创建新对象

  • 提取成分

    my $host = $uri->host;
    
    这也是有问题的,因为并非所有的
    URI
    都有主机,特别是如果有人将垃圾传递给函数,这将
    die()

  • 解析相对URL

    my $new_url = URI::URL->new($uri, $base)->abs;
    
    IIUC,如果没有
    ->abs
    ,结果仍然会字符串化到相对URL(并且对
    HTTP::Request
    s不起作用),对吗?此外,是否保证返回
    URI

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

    • 始终使用isa('URI')和can(“主机”)
      • 对我来说,似乎容易出错而且丑陋
    • 根本不要使用
      URI
      类,而是使用正则表达式解析url
      • 我仍然宁愿使用库解决方案,也不愿调试自己的解决方案
    • try{…}catch{…}
      • 看到第一点了吗

    使用
    URI
    类是否有一种明智、简单的方法?一些我没有想到的简单问题(在上面的列表中)?

    我想你的问题可以概括为:参数验证很乏味,我该怎么办

  • 我也不喜欢。这在开发者中是一个不同意见的问题,其他人说强制比切片面包好,特别是当由驼鹿自动完成时。我认为只允许一种类型的程序简化了程序。此外,雅格尼适用于绝大多数情况。拒绝错误的类型,请使用//等帮助器模块,以避免代码示例中所示的手动检查

  • 这是理想的行为。异常处理机制允许您编写适合于每种情况的自定义代码。如果你认为它在美学上不讨人喜欢,那么就把它去掉,并考虑让异常不受约束的后果

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


  • 唯一没有回答的问题是“我应该如何处理这些问题?”,答案是“始终呼叫abs”。如果您已经有了一个绝对URI,那么它不会做任何事情。
    use Try::Tiny;
    my $host;
    try {
        $host = $uri->host;
    } catch {
        warn "Could not determine host for $uri. Message was: $_. Retry/abort/ignore?\n";
        …
    };