sprintf 返回参数数量而不是字符串

use*_*577 1 perl printf

我想包装该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)

这里出了什么问题?

Dav*_*oss 5

内置函数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)