2011-09-19 66 views
1

我想將文本/字符串存儲在數據庫的文本字段中。
該字符串中包含變量$ name。
當我將它從數據庫中拉出時,我希望在打印字符串之前將該變量替換爲我定義的值。如何將變量文本存儲到數據庫中?

# Variable I want to substitute # 
1. $name='John'; 

    # needs to be read from database # 
2. $txt{'hello'}="Hello ${name}, How are you?"; 

3. print "<tag>$txt{'hello'}</tag>"; 

它打印Hello John, How are you?根據需要,但是,當第二行被從數據庫中讀出,它顯示Hello ${name}, How are you?

有些事情,我發現是:

  1. Locale::Maketext
  2. $string =~ s/(\$\w+)/$1/eeg;
  3. my $string = sprintf 'Say hello to %s and %s', $foo, $bar;

有人能指導我如何做呢?

回答

6

你所描述的是一個模板。 CPAN上有許多不同複雜程度的模板系統。 Text::TemplateTemplate Toolkit是一對流行的。你不想讓你的模板訪問任意變量;這是一個安全漏洞。相反,將它們允許訪問的變量放入哈希中。

如果你需要的是一個非常簡單的系統,你可以做這樣的事情:

sub fill_in_template 
{ 
    my ($text, $values) = @_; 
    $text =~ s/ \$\{ ([^}\s]+) \} /$values->{$1}/gx; 
    return $text; 
} 

my %txt; 
my %values = (name => 'Your Name'); 

my $template = 'Hello ${name}, How are you?'; # $name NOT interpolated 
$txt{'hello'} = fill_in_template($template, \%values); 

print "<tag>$txt{'hello'}</tag>\n"; 

你可能會添加一些錯誤的情況下檢查模板使用,這不是定義的字段。但是如果你需要比這更復雜的東西,你可能更適合從CPAN中選擇現有的模板系統。

Locale::Maketext旨在用於國際化(因此,您的應用可以生成多種語言的輸出,而無需翻譯人員直接處理代碼),而不是您要查找的模板引擎。

相關問題