使用可变参数作为sprintf的参数

Sec*_*one 1 perl variadic-functions

我想编写一个包装器printf(...).

我的第一次尝试是:

sub printf2 {
    my $test = sprintf(@_);
    print $test;
}
Run Code Online (Sandbox Code Playgroud)

由于数组(在标量上下文中)不是格式字符串,因此不起作用(如预期的那样).

有谁知道解决方案?可能没有使用任何特殊包装?

编辑:在真实的背景下,我想使用sprintf.显然,printf和之间存在差异sprintf.

mob*_*mob 7

sprintf函数有一个($@) 原型,因此第一个参数sprintf始终在标量上下文中进行求值,即使它是一个数组.

$x = sprintf(@a);      # same as  sprintf(scalar @a)
Run Code Online (Sandbox Code Playgroud)

因此,在调用之前sprintf,您需要将模板与其余参数分开.这是一个简洁的方法:

sub printf2 {
    my $test = sprintf(shift, @_);
    print $test;
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,printf没有原型并做你期望的事情.

printf(@a);            # same as  printf($a[0], @a[1..$#a])
Run Code Online (Sandbox Code Playgroud)