Arrays 获取作为引用传递的数组的第一个元素的Perl脚本

Arrays 获取作为引用传递的数组的第一个元素的Perl脚本,arrays,perl,Arrays,Perl,我想通过向子例程传递4个数组来调用子例程,然后获取每个数组的第一个值,然后在子例程中创建一个新数组(传递的数组的第一个元素的数组),然后返回该数组。这是我试过的代码 my @a = (97,34,6,7); my @b = ("A", "B", "F", "D"); my @c = (5..15); my @d = (1..10); my @tailings = popmany ( \@a, \@b, \@c, \@d ); print @tailings; sub popmany {

我想通过向子例程传递4个数组来调用子例程,然后获取每个数组的第一个值,然后在子例程中创建一个新数组(传递的数组的第一个元素的数组),然后返回该数组。这是我试过的代码

my @a = (97,34,6,7);
my @b = ("A", "B", "F", "D");
my @c = (5..15);
my @d = (1..10);
my @tailings = popmany ( \@a, \@b, \@c, \@d );

print @tailings;

sub popmany {
    my @retlist = ();
    for my $aref (@_) {            #1
        my $arrele = @$aref;       #2
        push @retlist , $arrele    #3
    }
    return @retlist;
}
在#1中,我使用循环获得第一个数组,然后在第2行中,我将整个数组分配给一个变量,认为默认情况下perl只将数组的第一个变量存储到@arrele中。我把$arrele推到了一个新数组@retlist,很抱歉我没有引用任何注释,所以我的过程可能是错误的。但这给了我一个输出,比如 441110

这毫无意义

请给我解释一下代码,我该怎么做

在这里:

my $arrele = @$aref;
在这里,您要求perl将
@{$aref}
放入标量上下文,该上下文返回$aref指向的数组的长度(元素数)

相反,请尝试:

my $arrele = $aref->[0];
它将访问数组的第一个元素。

my $arrele = @$aref;  
@$aref
数组的长度指定给
$arrele
。要获取数组的第一个元素,可以使用以下任意一种方法:

my $arrele = $$aref[0];
my $arrele = $aref->[0];    
my ($arrele) = @$aref;  # note the parenthesis which create list context
此外,由于您基于另一个列表生成列表,因此可以使用
map

sub popmany {
    return map $_->[0], @_;
}

更简单地说是

  sub popmany 
  {
    map $_->[0], @_;
  }

谢谢你能告诉我为什么我的$arrele=$aref[0];不起作用?因为$aref是一个数组引用,而您正试图以数组的形式访问它。如果您非常想避免
$aref->[0]
,请尝试
@$aref[0]
,因为后者更清楚。$aref[0]表示“数组的第一个元素@aref”,但$aref是一个标量,包含对其他数组的引用,因此您需要使用->首先取消对它的引用。
$$aref[0]
也是一个可行的选择。我想我在上面的评论中写过,但再看一遍,我发现我无意中使用了一个单元素数组切片:$
popmany
作为一个名称是双重误导的
pop
删除数组的最后一个元素并返回它。这将返回第一个值而不改变数组。请将简单代码留给codegolf。简单的代码是要走的路,而这不是一条简单的路。
  sub popmany 
  {
    map $_->[0], @_;
  }