为什么printf和sprintf在给定数组时表现不同?

时间:2010-03-20 22:51:55

标签: perl

sub do_printf  { printf @_ }
sub do_sprintf { print sprintf @_ }

do_printf("%s\n", "ok");  # prints ok
do_sprintf("%s\n", "ok"); # prints 2

5 个答案:

答案 0 :(得分:14)

sprintf原型为$@printf原型为@

答案 1 :(得分:13)

来自perldoc on sprintf

  

与printf不同,sprintf不这样做   你通过时可能意味着什么   它是一个数组作为你的第一个参数。   数组给出了标量上下文,和   而不是使用的第0个元素   作为格式的数组,Perl将使用   数组中元素的数量为   格式,几乎从不   是有用的。

答案 2 :(得分:9)

请参阅codeholicMark的答案,了解有关其行为方式不同的原因。

作为解决方法,只需执行:

sub do_sprintf { print sprintf(shift, @_) }

然后,

sub do_printf  { printf @_ }
sub do_sprintf { print sprintf(shift, @_) }

do_printf("%s\n", "ok");  # prints ok
do_sprintf("%s\n", "ok2"); # prints ok2

答案 3 :(得分:2)

他们会做不同的事情。对于printf,输出一个流;对于sprintf,您希望构造字符串。它处理打印命令的格式 f )。 printf的主要目的是打印出它构造给流的值但是使用s(tring)printf(ormat)你只是试图创建字符串,而不是打印它。

printf返回打印到流中的字符数作为反馈。一旦将字符打印到流中,它们就会从程序的逻辑结构中传出。同时,sprintf需要交回一个字符串。最方便的方法是作为返回值 - 因为它在程序结构中可以检查长度,或者它是否包含任何'e'或任何你想要的。

为什么不应他们的行为方式不同?

答案 4 :(得分:1)

sprintf在标量上下文中计算数组。您的数组有两个元素,因此它的计算结果为“2”(没有尾随\ n)。