如何使用数组作为Perl中内置函数(sprintf,join等)的参数?

inn6fuwd  于 8个月前  发布在  Perl
关注(0)|答案(2)|浏览(78)

我有一个类似于以下的数组:

my @a = ('%d %d', 10, 20);

我想用这个数组的元素作为函数的参数。
如果我直接使用它,它会在标量上下文中被解释:

say sprintf(@a);       #=> 3

我也试过这个,当然不起作用:

@_ = @a; say sprintf;  #=> Not enough arguments...

一些语言的splat语法在这里也不起作用(我只是在这一点上胡乱猜测):

say sprintf(*@a);      #=> (error)

其他内置函数也会出现同样的问题,比如join
是否有任何方法可以获取一个任意的数组(长度未知)和一个任意的函数,并使用数组的元素作为函数的参数来调用函数?如果有,怎么做?

ugmeyewa

ugmeyewa1#

sprintf有原型$@,而不是@,因此传递给它的第一个参数在标量上下文中计算。
使用&作为子调用的前缀会忽略原型,但您必须使用内置程序的全名才能使其成为子调用:

say &CORE::sprintf(@a); # Perl 5.16+

或者显式传递第一个参数:

say sprintf($a[0], @a[1..$#a]);
krugob8w

krugob8w2#

sprintf操作符的行为类似于$@原型的sub。

$ perl -Mv5.14 -e'say prototype("CORE::sprintf") // "[none]"'
$@

因此,@a是在标量上下文中计算的。这会产生其中的元素数量。
破坏性解决方案:

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

非破坏性解决方案:

sprintf( $a[0], @a[ 1 .. $#a ] )

相关问题