我想包装 sprintf 函数以供以后的字符串操作。代码减少为错误:
#!/usr/bin/perl
sub myPrintf
{
printf (@_);
my $text = sprintf (@_);
print "$text\n";
}
myPrintf("X%.3f Y%.3f\n", 1.223243, 4.567567);
my $t2 = sprintf("X%.3f Y%.3f\n", 1.223243, 4.567567);
print "$t2";
输出是
X1.223 Y4.568
3
X1.223 Y4.568
“3”是否打印在第二行?如何解决这个问题?
我希望:
X1.223 Y4.568
X1.223 Y4.568
X1.223 Y4.568
这里出了什么问题?
sprintf
运算符的行为类似于具有 $@
原型的子函数。
因此,
@_
正在标量上下文中进行评估,产生其中的元素数量。
解决方案:
my $format = shift;
sprintf( $format, @_ )
内置函数
sprintf()
有一个原型。您可以通过运行以下代码看到这一点:
$ perl -E'say prototype("CORE::sprintf")'
$@
您可以看到原型是
$@
- 并且与该函数的 文档 相匹配,该文档称该函数被称为 sprintf FORMAT, LIST
。
原型开头的
$
强制在标量上下文中计算第一个参数。在标量上下文中计算数组会给出数组中的元素数量 - 因此您看到的是 3。
修复方法是在将输入数组传递给
sprintf()
之前对其进行拆分。
sub myPrintf
{
my ($fmt, @data) = @_;
printf (@_);
my $text = sprintf ($fmt, @data);
print "$text\n";
}