"printf"和"print sprintf"的区别

7
以下两个简单的Perl程序行为不同:
#file1
printf @ARGV;

#file2
$tmp = sprintf @ARGV;
print $tmp;

$> perl file1  "hi %04d %.2f" 5  7.12345
   #output:  hi 0005 7.12

$> perl file2 "hi %04d %.2f" 5  7.12345
   #output:  3

Why is the difference? I had thought the two programs are equivalent. Wonder if there is a way to make file2 (using "sprintf") to behave like file1.

3个回答

8

内置的sprintf函数有一个原型:

$ perl -e 'print prototype("CORE::sprintf")'
$@

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

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

使第二个脚本正常工作的一种方法是以以下方式调用它:

$tmp = sprintf shift @ARGV, @ARGV

另一个printfsprintf之间的区别是,print sprintf会将$\附加到输出中,而printf则不会(感谢ysth)。

谢谢大家,这帮了很多忙! - packetie
或者 $tmp = &CORE::sprintf(@ARGV); 如果您不想修改 @ARGV - Suic
1
或者sprintf $ARGV[0], @ARGV[1..$#ARGV] - LeoNerd

4

@ARGV 包含以列表形式传递给脚本的参数。 printf 获取该列表并按原样打印出来。

在第二个示例中,您正在使用 sprintf 与数组并将其分配给标量。这基本上意味着它将数组的长度存储在您的变量 $tmp 中。因此,您得到输出 3


3

来自perl文档(jaypal已经说过了)

与printf不同,当你将数组作为sprintf的第一个参数传递时,它不会执行你所期望的操作。该数组给出标量上下文,并且Perl使用数组中元素的数量而不是使用数组的第0个元素作为格式,这几乎从不有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接