我有一个如下数组:
my @a = ('%d %d',10,20);
我想使用此数组的元素作为函数的参数.
如果我只是尝试直接使用它,它会在标量上下文中解释:
say sprintf(@a); #=> 3
我也尝试了这个,当然没有用:
@_ = @a; say sprintf; #=> Not enough arguments...
某些语言的splat语法在这里也不起作用(我现在只是猜测):
say sprintf(*@a); #=> (error)
其他内置函数(例如join)也会出现同样的问题.
解决方法
sprintf有原型$@,而不是@,所以传递给它的第一个参数是在标量上下文中计算的.
用&前缀一个子呼叫忽略原型,但你必须使用内置的全名作为子调用:
say &CORE::sprintf(@a); # Perl 5.16+
或明确传递第一个参数:
say sprintf($a[0],@a[1..$#a]);