我有一个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);
});
问题在于,它仅返回查询部分,并在存在时删除“路径”部分。
我想要所有这些内容:路径,域,原型等...-我只想添加/修改查询部分,并且只添加/修改“ q_key1”和“ q_key1”参数。
我该怎么做?
答案 0 :(得分:6)
因为您在->merge
显式返回的Mojo :: Parameters对象上调用->query
,所以您仅获得URL的查询部分。改掉->merge
和use an array reference,它将返回URL对象。
查询该URL的一部分,数组引用中的键/值对将与Mojo :: Parameters中的“合并”合并,而哈希引用中的键/值对将在Mojo :: Parameters中附加“ append”,默认为Mojo :: Parameters对象。
这就是您想要的。
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
。