如何只修改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 的查询部分。取而代之的是去掉 ->merge
和 use 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
.
我有一个 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 的查询部分。取而代之的是去掉 ->merge
和 use 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
.