在C ++中我会做这样的事情:
void some_func(const char *str, ...);
some_func("hi %s u r %d", "n00b", 420);
在PHP中我会这样做:
function some_func()
{
$args = func_get_args();
}
some_func($holy, $moly, $guacomole);
我如何在Perl中执行此操作?
sub wut {
# What goes here?
}
答案 0 :(得分:28)
你会这样做:
sub wut {
my @args = @_;
...
}
调用函数时,Perl会自动填充特殊的@_
变量。您可以通过多种方式访问它:
@_
或其中的单个元素$_[0]
,$_[1]
,等等将其分配给标量列表(或者可能是散列,或其他数组或其组合):
sub wut { my ( $arg1, $arg2, $arg3, @others ) = @_; ... }
请注意,在此表单中,您需要将数组@others
放在最后,因为如果您将其放在前面,它会淹没@_
的所有元素。换句话说,这不起作用:
sub wut {
my ( $arg1, @others, $arg2 ) = @_;
...
}
您还可以使用shift
从@_
中提取值:
sub wut {
my $arg1 = shift;
my $arg2 = shift;
my @others = @_;
...
}
请注意,如果您没有为shift
提供参数,@_
将自动对wut()
起作用。
编辑:您还可以使用散列或散列引用来使用命名参数。例如,如果您将wut($arg1, { option1 => 'hello', option2 => 'goodbye' });
称为:
sub wut {
my $arg1 = shift;
my $opts = shift;
my $option1 = $opts->{option1} || "default";
my $option2 = $opts->{option2} || "default2";
...
}
...然后你可以做类似的事情:
{{1}}
这是将命名参数引入函数的好方法,这样您以后可以添加参数,而不必担心它们的传递顺序。