sub do_printf { printf @_ }
sub do_sprintf { print sprintf @_ }
do_printf("%s\n", "ok"); # prints ok
do_sprintf("%s\n", "ok"); # prints 2
答案 0 :(得分:14)
sprintf
原型为$@
,printf
原型为@
答案 1 :(得分:13)
与printf不同,sprintf不这样做 你通过时可能意味着什么 它是一个数组作为你的第一个参数。 数组给出了标量上下文,和 而不是使用的第0个元素 作为格式的数组,Perl将使用 数组中元素的数量为 格式,几乎从不 是有用的。
答案 2 :(得分:9)
请参阅codeholic
和Mark
的答案,了解有关其行为方式不同的原因。
作为解决方法,只需执行:
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)。