【问题标题】:How can I pass the elements in a Perl array reference as separate arguments to a subroutine?如何将 Perl 数组引用中的元素作为单独的参数传递给子例程?
【发布时间】:2011-01-06 11:53:09
【问题描述】:

我有一个列表,其中包含我想传递给函数的参数。如何调用该函数?

例如,假设我有这个功能:

sub foo {
  my ($arg0, $arg1, $arg2) = @_;
  print "$arg0 $arg1 $arg2\n";
}

假设我有:

my $args = [ "la", "di", "da" ];

如何在不写foo($$args[0], $$args[1], $$args[2])的情况下调用foo

【问题讨论】:

  • APPLY 来自哪里?这是另一种语言的构造吗?
  • @daotoad 来自 Lisp,但大多数语言都有其等效形式。这是对 Google 来说非常困难的事情之一,因为不同的语言为同一件事构成了不同的术语。

标签: perl reference dereference


【解决方案1】:

这很简单。 foo(@{$args})

【讨论】:

    【解决方案2】:
    foo(@$args);
    

    或者,如果您有对 foo 的引用:

    my $func = \&foo;
    ...
    $func->(@$args);
    

    【讨论】:

      【解决方案3】:

      您可以通过在其前面粘贴 @ 来取消对数组引用的引用。

      foo( @$args );
      

      或者如果你想更明确:

      foo( @{ $args } );
      

      【讨论】:

        【解决方案4】:

        应该这样做:

        foo(@$args)
        

        这实际上不是apply 函数。该语法只是将数组引用解引用回普通数组。 man perlref 告诉你更多关于引用的信息。

        【讨论】:

        • 您也可以考虑不构造以开头的引用,即@args = ("la", "de", "dah") 甚至@args = qw(la de dah);,然后使用foo(@args) 传递它。这比参考舞蹈更简洁、更直接,但如果您有其他约束(例如,数组已经是数据结构的一部分),这并不是什么大问题。
        【解决方案5】:

        试试这个:

        foo(@$args);
        

        【讨论】:

          猜你喜欢
          • 2021-03-09
          • 2012-05-18
          • 1970-01-01
          • 2013-12-24
          • 2018-07-28
          • 2016-11-22
          • 1970-01-01
          • 2012-05-24
          • 1970-01-01
          相关资源
          最近更新 更多