你如何访问Perl中的函数参数?

JOS*_*HUA 15 perl subroutine

在C++中我会做这样的事情:

void some_func(const char *str, ...);
some_func("hi %s u r %d", "n00b", 420);
Run Code Online (Sandbox Code Playgroud)

在PHP中我会这样做:

function some_func()
{
    $args = func_get_args();
}
some_func($holy, $moly, $guacomole);
Run Code Online (Sandbox Code Playgroud)

我如何在Perl中做到这一点?

sub wut {
    # What goes here?
}
Run Code Online (Sandbox Code Playgroud)

Can*_*ice 28

你会这样做:

sub wut {
  my @args = @_;
  ...
}
Run Code Online (Sandbox Code Playgroud)

@_调用函数时,Perl会自动填充特殊变量.您可以通过多种方式访问​​它:

  • 直接,通过简单地使用@_或其中的各个元件为$_[0],$_[1]
  • 通过将其分配给另一个数组,如上所示
  • 通过将其分配给标量列表(或可能是散列,或其他数组或其组合):

    sub wut {
      my ( $arg1, $arg2, $arg3, @others ) = @_;
      ...
    }

请注意,在这种形式中,你需要将数组@others放在最后,因为如果你把它放在前面,它会淹没所有的元素@_.换句话说,这不起作用:

sub wut {
  my ( $arg1, @others, $arg2 ) = @_;
  ...
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下shift方式拉取值@_:

sub wut {
  my $arg1 = shift;
  my $arg2 = shift;
  my @others = @_;
  ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您不为其提供参数,shift它将自动处理@_.

编辑:您还可以使用散列或散列引用来使用命名参数.例如,如果您调用wut()如下:

wut($arg1, { option1 => 'hello', option2 => 'goodbye' });
Run Code Online (Sandbox Code Playgroud)

...然后你可以这样做:

sub wut {
  my $arg1 = shift;
  my $opts = shift;
  my $option1 = $opts->{option1} || "default";
  my $option2 = $opts->{option2} || "default2";
  ...
}
Run Code Online (Sandbox Code Playgroud)

这是将命名参数引入函数的好方法,这样您以后可以添加参数,而不必担心它们的传递顺序.

  • 如果你有*很多很多*args,你可能想避免复制它们:`sub wut {for my arg(@_){blah blah blah}}`.但是要小心,因为`@ _`中的每个元素都是原始参数的别名,你可以**改变你的调用变量**. (3认同)