我有一个类似于以下的数组:
my @a = ('%d %d', 10, 20);
我想用这个数组的元素作为函数的参数。
如果我直接使用它,它会在标量上下文中被解释:
say sprintf(@a); #=> 3
我也试过这个,当然不起作用:
@_ = @a; say sprintf; #=> Not enough arguments...
一些语言的splat语法在这里也不起作用(我只是在这一点上胡乱猜测):
say sprintf(*@a); #=> (error)
其他内置函数也会出现同样的问题,比如join
。
是否有任何方法可以获取一个任意的数组(长度未知)和一个任意的函数,并使用数组的元素作为函数的参数来调用函数?如果有,怎么做?
2条答案
按热度按时间ugmeyewa1#
sprintf
有原型$@
,而不是@
,因此传递给它的第一个参数在标量上下文中计算。使用
&
作为子调用的前缀会忽略原型,但您必须使用内置程序的全名才能使其成为子调用:或者显式传递第一个参数:
krugob8w2#
sprintf
操作符的行为类似于$@
原型的sub。因此,
@a
是在标量上下文中计算的。这会产生其中的元素数量。破坏性解决方案:
非破坏性解决方案: