如何在不考虑查询参数顺序的情况下测试 URI 相等性
How can I test URI equality without respecting query parameter ordering
我想要类似 URI::eq
的东西,除了这样比较的 URI 的规范形式忽略查询参数排序,
print URI::eq(
q[http://a.a/?a=1&z=2], # a before z
q[http://a.a/?z=2&a=1] # z before a
);
我想要这个return是的。
我建议将查询参数键作为列表获取(例如使用 URI::QueryParam ),对其进行排序并进行比较(可以使用 Data::Compare )。
如果它们相同,您必须比较每个键的值。
请记住,这不一定是微不足道的,值可以是 JSON,
你必须先解码或确保它是规范的,
所以直接 'eq' 可能会导致漏报。
解码 JSON 后,您将得到一个相当随意的数据结构(至少是可序列化的)。现在 eq 可能足以满足您的目的,也可能不够好,这再次取决于您的需要(空字符串是否与无值相同?0 与 0.0 相同吗?等等)。
您的示例似乎表明您没有考虑过这一点,因此您可能不需要它,这将使这变得非常简单:只需 'eq'- 比较所有值。或者您低估了问题,在这种情况下,您可能想问另一个问题或 post 其他信息。
就我个人而言,我不知道执行此操作的模块,但我很高兴得知有一个模块!
您可以规范化查询。
use List::Util qw( pairs );
$uri->query_form([
map { $_->[0], $_->[1] }
sort { $a->[0] cmp $b->[0] || $a->[1] cmp $b->[1] }
pairs
$uri->query_form
]);
我想要类似 URI::eq
的东西,除了这样比较的 URI 的规范形式忽略查询参数排序,
print URI::eq(
q[http://a.a/?a=1&z=2], # a before z
q[http://a.a/?z=2&a=1] # z before a
);
我想要这个return是的。
我建议将查询参数键作为列表获取(例如使用 URI::QueryParam ),对其进行排序并进行比较(可以使用 Data::Compare )。
如果它们相同,您必须比较每个键的值。
请记住,这不一定是微不足道的,值可以是 JSON, 你必须先解码或确保它是规范的, 所以直接 'eq' 可能会导致漏报。
解码 JSON 后,您将得到一个相当随意的数据结构(至少是可序列化的)。现在 eq 可能足以满足您的目的,也可能不够好,这再次取决于您的需要(空字符串是否与无值相同?0 与 0.0 相同吗?等等)。
您的示例似乎表明您没有考虑过这一点,因此您可能不需要它,这将使这变得非常简单:只需 'eq'- 比较所有值。或者您低估了问题,在这种情况下,您可能想问另一个问题或 post 其他信息。
就我个人而言,我不知道执行此操作的模块,但我很高兴得知有一个模块!
您可以规范化查询。
use List::Util qw( pairs );
$uri->query_form([
map { $_->[0], $_->[1] }
sort { $a->[0] cmp $b->[0] || $a->[1] cmp $b->[1] }
pairs
$uri->query_form
]);