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

mac*_*mac 4 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 {
    my @retlist = ();
    for my $aref (@_) {            #1
        my $arrele = @$aref;       #2
        push @retlist , $arrele    #3
    }
    return @retlist;
}
Run Code Online (Sandbox Code Playgroud)

在#1中我使用循环并获取第一个数组,然后在第2行中我将整个数组分配给变量,认为默认情况下perl只会将数组的第一个变量存储到@arrele中.我把$ arrele推到一个新的数组@retlist,对不起,我提到任何注释,所以我的程序可能是错的.但这给我一个像441110这样的输出

没有任何意义.

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

Ale*_*lex 11

它在这里:

my $arrele = @$aref;
Run Code Online (Sandbox Code Playgroud)

你要求perl放入@{$aref}标量上下文,它返回$ aref指向的数组的长度(元素的数量).

而是尝试:

my $arrele = $aref->[0];
Run Code Online (Sandbox Code Playgroud)

这将访问数组的第一个元素.

  • $ aref [0]表示"数组@aref的第一个元素",但$ aref是一个包含对其他数组的引用的标量,因此您需要先使用 - >取消引用它. (2认同)
  • $$ aref [0]也是一个可行的选择。 (2认同)

Eug*_*ash 5

这条线

my $arrele = @$aref;  
Run Code Online (Sandbox Code Playgroud)

指定@$aref数组的长度$arrele.要获取数组的第一个元素,您可以使用以下任何一个:

my $arrele = $$aref[0];
my $arrele = $aref->[0];    
my ($arrele) = @$aref;  # note the parenthesis which create list context
Run Code Online (Sandbox Code Playgroud)

此外,由于您基于另一个列表生成列表,您可以使用map:

sub popmany {
    return map $_->[0], @_;
}
Run Code Online (Sandbox Code Playgroud)