我应该如何使用Perl URI类?

jpa*_*cek 5 oop url perl

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

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

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

    sub foo_string_or_url {
      my $uri = URI->new(shift);
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 提取组件

    my $host = $uri->host;
    
    Run Code Online (Sandbox Code Playgroud)

    这也是有问题的,因为并非所有URIs都有主机,特别是如果有人将垃圾传递给函数,这将是die().

  3. 解析相对URL

    my $new_url = URI::URL->new($uri, $base)->abs;
    
    Run Code Online (Sandbox Code Playgroud)

    IIUC,没有->abs,结果仍然会串联到相对URL(并且不适用于HTTP::Requests),我是对的吗?此外,这是否保证返回URI

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

  • 使用->isa('URI')->can("host")所有时间
    • 对我来说似乎容易出错并且很难看
  • 根本不使用URI类并使用正则表达式解析URL
    • 我仍然宁愿使用库解决方案而不是自己调试
  • 包裹URI操作try { ... } catch { ... }
    • 看到第一点

使用这些URI课程是否有一种理智,傻瓜的方式?我没有想到的简单(在上面的列表中)?

dax*_*xim 7

我认为你的问题可以概括为:参数验证很繁琐,我该怎么办呢?

  1. 我也不喜欢它.这是开发商之间不同意见的问题,其他人说强制比切片面包更好,特别是当由Moose自动完成时.我认为只允许一种类型的程序简化了程序.此外,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";
        …
    };
    
    Run Code Online (Sandbox Code Playgroud)
  3. 是的,是的.

  • 唯一没有回答的问题是"我该如何处理这些问题?",答案是"总是叫做abs".如果您已经拥有绝对URI,它将不会执行任何操作. (3认同)