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

问题描述 投票:0回答:2

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

这里出了什么问题?

perl printf
2个回答
0
投票

sprintf
运算符的行为类似于具有
$@
原型的子函数。

因此,

@_
正在标量上下文中进行评估,产生其中的元素数量。

解决方案:

my $format = shift;
sprintf( $format, @_ )

0
投票

内置函数

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";
}
© www.soinside.com 2019 - 2024. All rights reserved.