我发现了这个Perl代码:
$url = "http://example.com/?param1=#param1#¶m2=#param2#"
$param1="hello";
$param2="world";
$url =~ s/#param1#/$param1/g;
$url =~ s/#param2#/$param2/g;
=~
运算符应用正则表达式并替换原始变量($url
)。
Perl中是否有办法将更改应用于另一个变量,并将两个正则表达式应用于一个语句中?
看起来像这样:
$url_template = "http://example.com/?param1=#param1#¶m2=#param2#"
$param1="hello";
$param2="world";
$url = $url_template ~ s/#param1#/$param1/g ~ s/#param2#/$param2/g;
此代码不起作用。问题是:如何使其发挥作用?
另外,有没有更好的格式化字符串的方法?例如
String.format("http://example.com/?param1={param1}¶m2={param2}", {"param1": param1, "param2": param2}).
最后,是否有更好的方法来格式化URL参数(以便正确编码)?例如
URL.format("http://example.com/?param1={param1}¶m2={param2}", {"param1": param1, "param2": param2}).
更新 基于choroba和aleroot的完整答案:
my $template_url = "http://example.com/?param1=#param1#¶m2=#param2#";
my %params = (param1 => 'hello1', param2 => 'world2');
(my $url = $template_url) =~ s/#(.*?)#/$params{$1}/g;
对于网址编码,请使用URL::Encode。
答案 0 :(得分:6)
Perl绑定操作符为=~
,而不是~=
。不可能同时进行两次替换,但是可以根据需要使/g
进行多次替换:
#!/usr/bin/perl
use warnings;
use strict;
my $url = 'http://example.com/?param1=#param1#¶m2=#param2#';
my %params = ( param1 => 'hello',
param2 => 'world',
);
$url =~ s/#(.*?)#/$params{$1}/g;
print $url, "\n";
对于网址编码,请使用URL::Encode。
答案 1 :(得分:1)
将正则表达式替换存储到另一个变量($newurl
):
($newurl = $url) =~ s/#param1#/$param1/g;