我有一个如下数组:
my @a = ('%d %d', 10, 20);
我想使用此数组的元素作为函数的参数。
如果我只是尝试直接使用它,它会在标量上下文中解释:
say sprintf(@a); #=> 3
我也试过这个,当然没有成功:
@_ = @a; say sprintf; #=> Not enough arguments...
某些语言的splat语法在这里也没有用(我此时只是猜测):
say sprintf(*@a); #=> (error)
其他内置函数也会出现同样的问题,例如join
。
有没有办法获取任意数组(长度未知)和任意函数,并使用数组元素作为函数的参数调用函数?如果是这样,怎么样?
答案 0 :(得分:7)
sprintf
包含原型$@
,而不是@
,因此传递给它的第一个参数在标量上下文中进行评估。
使用&
前缀子调用会忽略原型,但您必须使用内置函数的全名作为子调用:
say &CORE::sprintf(@a); # Perl 5.16+
或明确传递第一个参数:
say sprintf($a[0], @a[1..$#a]);