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

Eug*_*ash 10 perl

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

do_printf("%s\n", "ok");  # prints ok
do_sprintf("%s\n", "ok"); # prints 2
Run Code Online (Sandbox Code Playgroud)

cod*_*lic 14

sprintf有原型$@printf有原型@

  • 无处不在的猜测:`sprintf`有原型`($ @)`因为它可以; `printf`没有原型,因为(比如`print`)它可以采用一个裸字文件句柄(例如`printf FH"格式",...`所以它需要解析器魔法超出原型系统可以管理的范围. (7认同)

Mar*_*ark 13

来自sprintf上perldoc:

与printf不同,当你传递一个数组作为你的第一个参数时,sprintf不会做你可能的意思.数组被赋予标量上下文,而不是使用数组的第0个元素作为格式,Perl将使用数组中的元素计数作为格式,这几乎从来没用过.


vla*_*adr 9

请参阅codeholic's和Mark's答案,了解他们为什么表现不同.

作为一种解决方法,只需:

sub do_sprintf { print sprintf(shift, @_) }
Run Code Online (Sandbox Code Playgroud)

然后,

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

do_printf("%s\n", "ok");  # prints ok
do_sprintf("%s\n", "ok2"); # prints ok2
Run Code Online (Sandbox Code Playgroud)