在Perl中使用单个命令将元素添加到多个数组

时间:2019-04-05 07:24:51

标签: perl

我可以使用push in perl将元素添加到多个数组中吗?

例如

my @arr1 = qw/one two three/;
my @arr2 = qw/four five six/;
push (@arr1,@arr2), "extra";

预期输出::

@arr1 = one two three extra
@arr2 = four five six extra

1 个答案:

答案 0 :(得分:2)

documentation for push()很清楚。

  

推送数组,列表

     

通过附加的值将ARRAY视为堆栈   列出到ARRAY的末尾。 ARRAY的长度增加长度   的清单。与

具有相同的效果
for my $value (LIST) {
    $ARRAY[++$#ARRAY] = $value;
}
     

,但效率更高。返回完成推送后数组中元素的数量。

     

从Perl 5.14开始,一项实验功能允许用户进行推送   标量表达式。该实验被认为是失败的,并且   从Perl 5.24开始被删除。

所以,不。 push()一次只能使用一个数组。

您的解决方案:

push (@arr1,@arr2), "extra";

具有将所有@arr2元素添加到@arr1末尾的效果。 “多余”将被忽略,因为右括号将被视为结束push()的参数列表。在use warnings下,您会看到一条警告:

  

在无效上下文中无用的常量(“多余”)

您可以通过两次调用push()并将复杂性隐藏在子例程中来实现。天真的解决方案使用对数组的引用:

sub twopush {
  my ($a1, $a2, @elems) = @_;

  push @$a1, @elems;
  push @$a2, @elems;
}

twopush(\@arr1, \@arr2, "extra");

但这是Perl的子例程原型很有用的少数情况之一。您可以告诉子例程前两个参数是数组,编译器将处理获取引用的情况。

sub twopush(\@\@@) {
  my ($a1, $a2, @elems) = @_;

  push @$a1, @elems;
  push @$a2, @elems;
}

twopush(@arr1, @arr2, "extra");