我需要在 Perl 程序中处理一些 HTTP URL,但我怀疑应该如何处理URI https://metacpan.org/module/URI类帮助我。
特别是,我想使用URI
用于解析相对 URL 并获取其组件的类。然而,问题是:
-
我需要一个可以同时使用两者的函数URI
对象和 URI 字符串作为参数(或确保只传递一个)
sub foo_string_or_url {
my $uri = URI->new(shift);
这是正确的做法吗?我不太喜欢它,因为它使URI
并不必要地创建新对象。
-
提取组件
my $host = $uri->host;
这也是有问题的,因为并不是所有的URI
s 有主机,特别是,如果有人将垃圾传递给该函数,这将die()
.
-
解析相对 URL
my $new_url = URI::URL->new($uri, $base)->abs;
IIUC,没有->abs
,结果仍然会字符串化为相对 URL(并且不适用于HTTP::Request
s),我说得对吗?另外,这是否保证返回URI
?
我该如何处理这些问题呢?可能性是
- Use
->isa('URI')
and ->can("host")
all the time
- Don't use
URI
class at all and parse URLs using regexes
- 我仍然宁愿使用库解决方案而不是调试我自己的解决方案
- Wrap
URI
operations in try { ... } catch { ... }
有没有一种明智的、万无一失的方法来使用URI
课程?我没有想到的简单的事情(在上面的列表中)?
我想你的问题可以概括为:参数验证很繁琐,我该怎么办?
我也不喜欢它。其他人说,这是开发人员之间意见不同的问题强制比切片面包更好,尤其是由 Moose 自动完成时。我认为只允许一种类型可以简化程序。此外,YAGNI 适用于绝大多数情况。拒绝错误的类型,使用辅助模块,例如参数::验证 http://search.cpan.org/~drolsky/Params-Validate-1.06/lib/Params/Validate.pm/MooseX::方法::签名 http://search.cpan.org/~ilmari/MooseX-Method-Signatures-0.37/lib/MooseX/Method/Signatures.pm/MooseX::声明 http://search.cpan.org/~flora/MooseX-Declare-0.35/lib/MooseX/Declare.pm为了避免代码示例中所示的手动检查。
-
这是期望的行为。异常处理机制允许您编写适合每种情况的自定义代码。如果您认为它不美观,请将其删除并注意让异常不受控制的后果。
use Try::Tiny;
my $host;
try {
$host = $uri->host;
} catch {
warn "Could not determine host for $uri. Message was: $_. Retry/abort/ignore?\n";
…
};
是的,是的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)