如何只修改URL中"query"的一部分?

How can I modify only a part of "query" in URL?

我有一个 Mojo 应用程序。我有一个来自 "a" 标签的 URL 列表。我想 向每个查询参数添加一些查询参数,或者修改其中现有的查询参数(如果它们已经存在于 URL 中)。 URL 的其余部分必须保持不变。 我是这样做的:

  $doc->find('a')->each(sub {
    my $aTag = $_;
    my $aUrl = Mojo::URL->new($aTag->attr('href'));
    my $newUrl = $aUrl->query->merge('q_key1' => 'something', 'q_key2' => 'something2'); # <--- warn: returns only the query part, removes the "path" part
    $_->attr('href' => $newUrl->to_string);
  });  

问题是它 returns 只有查询部分并删除,例如 "path" 存在的部分。

而我想要的都是原样:路径、域、原型等... -- 我只想要 add/modify 查询部分并且只想要 "q_key1" 和 "q_key1"参数。

我该怎么做?

因为您在 ->query return 的 Mojo::Parameters 对象上显式调用 ->merge,您只能得到 URL 的查询部分。取而代之的是去掉 ->mergeuse an array reference,它将 return URL 对象。

Query part of this URL, key/value pairs in an array reference will be merged with "merge" in Mojo::Parameters, and key/value pairs in a hash reference appended with "append" in Mojo::Parameters, defaults to a Mojo::Parameters object.

这就是你想要的。

use Mojo::URL;

my $url = Mojo::URL->new('http://example.org/foo?bar=test&q_key1=asdf');
my $new_url = $url->query( 
    [ 
        'q_key1' => 'something',
        'q_key2' => 'something2',
    ]
);
say $new_url->to_string;

输出:

http://example.org/foo?bar=test&q_key1=something&q_key2=something2

请注意,这不是副本,而是具有更新值的同一对象。您不需要将其分配给 $new_url.