在Perl中我应该使用什么而不是printf?

Nik*_*nko 7 perl printf string-formatting

我需要在Perl中使用一些字符串替换来简化翻译,即替换很多

print "Outputting " . $n . " numbers";
Run Code Online (Sandbox Code Playgroud)

通过类似的东西

printf ("Outputting %d numbers", $n);
Run Code Online (Sandbox Code Playgroud)

但是,我想用更容易为人类解析的东西替换printf,如下所示:

printX ("Outputting {num} numbers", { num => $n });
Run Code Online (Sandbox Code Playgroud)

或者通常是更多Perly.

你能推荐一些你喜欢和使用的东西(无论是否来自CPAN)?

Gre*_*ill 14

简单来说:

 print "Outputting $n numbers";
Run Code Online (Sandbox Code Playgroud)

那非常Perly.如果你不需要任何花哨的格式,字符串插值绝对是你要走的路.

  • 在插值中输出任意表达式有一个习惯用法:print"Hash is:@ {[Dumper(\%hash)]}"; 它不漂亮,但它的工作原理. (3认同)

dra*_*tun 12

CPAN上的大多数模板模块可能会做你想要的.以下是使用Template Toolkit的示例...

use Template;
my $tt = Template->new;

$tt->process( \"Outputting [% num %] numbers\n", { num => 100 } );
Run Code Online (Sandbox Code Playgroud)


你可以用这样的东西模仿你所需的例子......

sub printX {
    use Template;
    my $tt = Template->new( START_TAG => '{', END_TAG => '}' );
    $tt->process( \( $_[0] . "\n" ), $_[1] );
}
Run Code Online (Sandbox Code Playgroud)

你有......

printX 'Outputting {num} numbers' => { num => 100 };
Run Code Online (Sandbox Code Playgroud)


noh*_*hat 5

print内建对于大多数情况下是非常方便的.除了变量插值:

print "Outputting $n numbers";    # These two lines
print "Outputting ${n} numbers";  # are equivalent
Run Code Online (Sandbox Code Playgroud)

请记住,print可以使用多个参数,因此如果需要打印子例程调用的结果,则无需先将它们连接成单个字符串:

print "Output data: ", Dumper($data);
Run Code Online (Sandbox Code Playgroud)

但是,要输出除简单整数之外的数字,您可能需要printf的格式化便利性.但是,输出其他数据类型很容易print.

您可以join使用方便输出数组:

print join ', ', @array;
Run Code Online (Sandbox Code Playgroud)

而有机结合起来map,并keys输出哈希:

print join ', ', map {"$_ : $hash{$_}"} keys %hash;
Run Code Online (Sandbox Code Playgroud)

qq如果要在数据周围输出引号,请使用运算符:

print join ', ', map {qq("$_" : "$hash{$_}"}) keys %hash;
Run Code Online (Sandbox Code Playgroud)


Bri*_*ips 5

如果您希望简化翻译,则应考虑使用其中一个可用的L10n/i18n CPAN模块.具体来说,很好地概述了为什么你的方法最终会失败,这是作为Local :: Maketext文档的一部分编写的.

与Locale :: Maketext很好地配对的另一个很棒的模块是Locale :: Maketext :: Lexicon.这允许您使用更标准的本地化格式,例如gettext的.po/.mo文件,这些文件具有GUI工具,可帮助翻译人员处理所有需要翻译的文本.Locale :: Maketext :: Lexicon还附带了一个帮助脚本(xgettext.pl),可帮助您的本地化文件与包含需要翻译的文本的模板或模块保持同步.过去,我在这种设置方面取得了非常好的成绩.