用他们的值替换从数据库中提取的变量

时间:2016-10-07 20:14:32

标签: mysql perl variables cgi

我想用多种语言翻译perl网站。我搜索并尝试了很多想法,但我认为最好的方法是将所有翻译保存在mySQL数据库中。但我遇到了问题...

当从数据库中提取的句子包含变量(标量)时,它会在网页上以标量打印:

You have $number new messages.

是否有正确的方法来重新分配$number其实际值?

感谢您的帮助!

1 个答案:

答案 0 :(得分:-1)

您可以在数据库中使用printf格式字符串,并将值传入其中。 printf允许您指定参数的位置,因此只知道参数列表“$ number”的位置。

例如

#!/usr/bin/perl

use strict;

my $Details = {
   'Name' => 'Mr Satch',
   'Age'  => '31',
   'LocationEn' => 'England',
   'LocationFr' => 'Angleterre',
   'NewMessages' => 20,
   'OldMessages' => 120,
};

my $English = q(
 Hello %1$s, I see you are %2$s years old and from %3$s
 How are you today?
 You have %5$i new messages and %6$i old messages
 Have a nice day
);
my $French = q{
 Bonjour %1$s, je vous vois d'%4$s et âgés de %2$s ans.
 Comment allez-vous aujourd'hui?
 Vous avez %5$i nouveaux messages et %6$i anciens messages.
 Bonne journée.
};
printf($English, @$Details{qw/Name Age LocationEn LocationFr NewMessages OldMessages/});
printf($French,  @$Details{qw/Name Age LocationEn LocationFr NewMessages OldMessages/});

这将是一个维护的噩梦,所以另一种选择可能是在数据库中包含一个参数列表:

#!/usr/bin/perl

use strict;

sub fetch_row {
   return { 
      'Format' => 'You have %i new messages and %i old messages' . "\n",
      'Arguments'  => 'NewMessages OldMessages',
   }
}

sub PrintMessage {
    my ($info,$row) = @_;
    printf($row->{'Format'},@$info{split(/ +/,$row->{'Arguments'})});
}

my $Details = {
   'Name' => 'Mr Satch',
   'Age'  => '31',
   'LocationEn' => 'England',
   'LocationFr' => 'Angleterre',
   'NewMessages' => 20,
   'OldMessages' => 120,
};

my $row = fetch_row();
PrintMessage($Details,$row)