以下两个简单的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
为什么不同?我原以为这两个程序是等价的.不知道是否有办法让file2(使用“sprintf”)表现得像file1.
解决方法
内置的sprintf函数有一个原型:
$perl -e 'print prototype("CORE::sprintf")' $@
它将第一个参数视为标量.由于您提供了@ARGV参数,因此通过传递@ARGV中的元素数量将其强制转换为标量.
由于printf函数必须支持语法printf HANDLE TEMPLATE,LIST以及printf TEMPLATE,LIST,因此它不支持原型.因此它始终将其参数视为平面列表,并使用列表中的第一个元素作为模板.
使第二个脚本正常工作的一种方法是将其称为
$tmp = sprintf shift @ARGV,@ARGV
printf和sprintf之间的另一个区别是print sprintf将$\
附加到输出,而printf没有(感谢,ysth).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。