如何将包含变量的文本存储到数据库中?

时间:2011-09-19 22:15:48

标签: mysql perl internationalization

我想将文本/字符串存储在数据库的文本字段中 该字符串中包含变量$ 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?,但是当从数据库中读取第2行时,它会显示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;
  4. 有人可以指导我如何去做吗?

1 个答案:

答案 0 :(得分: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旨在实现国际化(因此您的应用可以使用多种语言生成输出,而无需翻译人员直接处理代码),而不是您正在寻找的那种模板引擎。