2017-10-05 3 views
0

したがって、私はperl文字列に書かれたHTMLを持っています。このhtmlはテンプレートを表し、実行時にフィールドを追加する必要があります。たとえば :PERL文字列として書かれたHTMLに値を置き換える/追加する

$templateHTML.= '<span > %{name} </span> 

私は必要な値で%{name}を交換したいです。私が試してみました 正規表現は次のとおりです。

$htmlTemplate.=~ s/%{name}/akhil; 

これは動作しませんでした、また、私にはJavaScriptの置き換え機能を使用することができる方法は、すなわち、そこにある私はJS文字列とそれを処理するperlの文字列を変換することができますか?

要求により、テンプレートが呼び出され、追加される値がパラメータとして渡されます。

答えて

0

この解決:

my $find = "%{name}"; 
    my $replace = "had"; 
    $find = quotemeta $find; # escape regex metachars if present 

    $str =~ s/$find/$replace/g; 

出典:http://www.perlmonks.org/?node_id=98357

は動作しませんでした、値を直接与えます。私はなぜ、見上げて戻ってくるのか分からない。

+0

正規表現の中にあなたが使用することができます '\ Q .. \ E':私は何かを逃したことを知らせるために。実際には '$ str =〜s /%{name}/$ replace/g;'は元の質問の中で置換を実行しながら値を連結しています。 – mkHun

0

独自のテンプレートシステムを発明しています。そして、あなたがすでに持っているものと同じくらい柔軟で強力なものを発明しようとは思わないでしょう。ですから、代わりにthe Template Toolkitのようなものを使用することをお勧めします。

プランを続行する場合は、the FAQから該当するセクションを読んでください。あなたはそれを避けることができる場合は、

(brian d foyによって寄贈されまし)How can I expand variables in text strings?

はそうではない、またはあなたが、このようなテキスト::テンプレートまたはテンプレートツールキットとしてテンプレートシステムを使用することができる場合、その代わりにしてください。あなたも、仕事がsprintfまたはprintfで成し遂げることができるかもしれません:

my $string = sprintf 'Say hello to %s and %s', $foo, $bar; 

しかし、私は完全なテンプレートシステムを引き出したくない一回限りの単純なケースのために、私が使用しますその中に2つのPerlスカラー変数を持つ文字列。この例では、私は彼らの変数の値に$foo$barを展開したい:私はこれを行うことができます

my $foo = 'Fred'; 
    my $bar = 'Barney'; 
    $string = 'Say hello to $foo and $bar'; 

一つの方法は、置換演算子とダブル/eフラグを必要とします。最初の/eは交換側で$1と評価され、$fooに変わります。 2番目の/eは$ fooで始まり、その値で置き換えられます。 $fooは、その後、「フレッド」に変わり、それが文字列に残っているもの、最終的です:

$string =~ s/(\$\w+)/$1/eeg; # 'Say hello to Fred and Barney' 

/eも静かに空の文字列で、未定義の変数名を置き換える、厳しいの違反を無視します。私は/eフラグを使用しているので(2回も!)、私は文字列形式でevalと同じセキュリティ問題を抱えています。 $fooに何か奇妙なものがある場合、おそらく@{[ system "rm -rf /" ]}のようなものがあれば、困ってしまうかもしれません。

セキュリティ上の問題を回避するために、変数名を評価する代わりにハッシュから値を取得することもできます。単一の/eを使用すると、値が存在することを確認するためにハッシュをチェックすることができ、そうでない場合、欠損値をマーカーで置き換えることができます。

my $string = 'This has $foo and $bar'; 
    my %Replacements = (
     foo => 'Fred', 
     ); 
    # $string =~ s/\$(\w+)/$Replacements{$1}/g; 
    $string =~ s/\$(\w+)/ 
       exists $Replacements{$1} ? $Replacements{$1} : '???' 
       /eg; 
    print $string; 
関連する問題