"printf"和"print sprintf"之间的区别

pac*_*tie 7 perl printf

以下两个简单的perl程序有不同的行为:

#file1
printf @ARGV;
Run Code Online (Sandbox Code Playgroud)

#file2
$tmp = sprintf @ARGV;
print $tmp;
Run Code Online (Sandbox Code Playgroud)

$> perl file1  "hi %04d %.2f" 5  7.12345
   #output:  hi 0005 7.12
Run Code Online (Sandbox Code Playgroud)

$> perl file2 "hi %04d %.2f" 5  7.12345
   #output:  3
Run Code Online (Sandbox Code Playgroud)

为什么有区别?我原以为这两个程序是等价的.不知道是否有办法让file2(使用"sprintf")表现得像file1.

mob*_*mob 8

内置sprintf函数有一个原型:

$ perl -e 'print prototype("CORE::sprintf")'
$@
Run Code Online (Sandbox Code Playgroud)

它将第一个参数视为标量.由于您提供了参数@ARGV,因此通过传递元素的数量将其强制转换为标量@ARGV.

由于该printf功能必须支持语法printf HANDLE TEMPLATE,LIST以及printf TEMPLATE,LIST,它不能支持的原型.因此它始终将其参数视为平面列表,并使用列表中的第一个元素作为模板.

使第二个脚本正常工作的一种方法是将其称为

$tmp = sprintf shift @ARGV, @ARGV
Run Code Online (Sandbox Code Playgroud)

printf和之间的另一个区别sprintfprint sprintf附加$\到输出,而printf不是(谢谢,ysth).