Как хранить текст с переменными в базе данных? - PullRequest
1 голос
/ 20 сентября 2011

Я хочу сохранить текст / строку в текстовом поле в базе данных.
Эта строка содержит переменную $ 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;

Может кто-нибудь подсказать мне, как это сделать?

1 Ответ

6 голосов
/ 20 сентября 2011

То, что вы описываете, это шаблон. В CPAN существует множество систем шаблонов различной степени сложности. Text :: Template и Template 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 предназначен для интернационализации (поэтому ваше приложение может производить вывод на нескольких языках без необходимости работать с кодом переводчикам напрямую) и не является тем механизмом шаблонов, который вам нужен для.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...