2

次の 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 で変更を別の変数に適用し、1 つのステートメントで 2 つの正規表現を適用する方法はありますか?

次のようになります。

$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 のエンコードには、 URL::Encodeを使用します。

4

2 に答える 2

6

Perl バインディング オペレーターは=~ではなく~=です。一度に 2 つの置換を行うことはできませんが、必要に応じて何度でも置換を行うことができます/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 のエンコードには、 URL::Encodeを使用します。

于 2013-08-15T09:19:08.040 に答える
1

正規表現置換を別の変数 ( $newurl) に保存するには:

($newurl = $url) =~ s/#param1#/$param1/g;
于 2013-08-15T09:19:16.150 に答える