我想包装该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";
Run Code Online (Sandbox Code Playgroud)
输出是
X1.223 Y4.568
3
X1.223 Y4.568
Run Code Online (Sandbox Code Playgroud)
“3”是否打印在第二行?如何解决这个问题?
我期望:
X1.223 Y4.568
X1.223 Y4.568
X1.223 Y4.568
Run Code Online (Sandbox Code Playgroud)
这里出了什么问题?
内置函数sprintf()有一个原型。您可以通过运行以下代码来看到这一点:
$ perl -E'say prototype("CORE::sprintf")'
$@
Run Code Online (Sandbox Code Playgroud)
您可以看到原型是$@- 并且与该函数的文档相匹配,该文档称该函数被称为sprintf FORMAT, LIST。
原型开头的强制$在标量上下文中计算第一个参数。在标量上下文中计算数组会给出数组中的元素数量 - 因此您看到的是 3。
修复方法是在将输入数组传递给sprintf().
sub myPrintf
{
my ($format, @data) = @_;
printf (@_);
my $text = sprintf ($format, @data);
print "$text\n";
}
Run Code Online (Sandbox Code Playgroud)