用编码的字符串替换URL的多个部分

时间:2013-08-15 09:06:46

标签: regex perl

我发现了这个Perl代码:

$url = "http://example.com/?param1=#param1#&param2=#param2#"
$param1="hello";
$param2="world";
$url =~ s/#param1#/$param1/g;
$url =~ s/#param2#/$param2/g;

=~运算符应用正则表达式并替换原始变量($url)。 Perl中是否有办法将更改应用于另一个变量,并将两个正则表达式应用于一个语句中?

看起来像这样:

$url_template = "http://example.com/?param1=#param1#&param2=#param2#"
$param1="hello";
$param2="world";
$url = $url_template ~ s/#param1#/$param1/g ~ s/#param2#/$param2/g;

此代码不起作用。问题是:如何使其发挥作用?

另外,有没有更好的格式化字符串的方法?例如

String.format("http://example.com/?param1={param1}&param2={param2}", {"param1": param1, "param2": param2}).

最后,是否有更好的方法来格式化URL参数(以便正确编码)?例如

URL.format("http://example.com/?param1={param1}&param2={param2}", {"param1": param1, "param2": param2}).

更新 基于choroba和aleroot的完整答案:

my $template_url = "http://example.com/?param1=#param1#&param2=#param2#";
my %params = (param1 => 'hello1', param2 => 'world2');
(my $url = $template_url) =~ s/#(.*?)#/$params{$1}/g;

对于网址编码,请使用URL::Encode

2 个答案:

答案 0 :(得分:6)

Perl绑定操作符为=~,而不是~=。不可能同时进行两次替换,但是可以根据需要使/g进行多次替换:

#!/usr/bin/perl
use warnings;
use strict;

my $url = 'http://example.com/?param1=#param1#&param2=#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;