我有一个Mojo应用程序。我有一个来自“ a”标签的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”参数。
我怎样才能做到这一点?
因为您调用显式返回->merge
的Mojo :: Parameters对象,所以->query
您仅获得URL的查询部分。摆脱->merge
并使用数组引用代替,它将返回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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句