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

6

我希望通过传递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;
}

这里,我使用一个循环并获取第一个数组,在第二行中,我将整个数组分配给一个变量,认为默认情况下perl只会将数组的第一个变量存储到@arrele中。然后我将$arrele推入新数组@retlist中,很抱歉我没有参考任何笔记,所以我的过程可能是错误的。但是这给我输出了一个毫无意义的结果441110。

请解释一下这段代码如何实现。


popmany 这个名称具有双重误导性。pop移除 数组的 最后一个 元素并将其返回。而 popmany 则会返回数组的 第一个 值,而不会改变数组。 - TLP
4个回答

16

在这里:

my $arrele = @$aref;

你让Perl把@{$aref}放到标量上下文中,这会返回指向$aref的数组中元素的数量(也就是数组长度)。

相反地,请尝试:

my $arrele = $aref->[0];

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


谢谢...你能告诉我为什么我的 $arrele = $aref[0]; 无法工作吗? - mac
1
因为 $aref 是一个数组引用,而你试图将其作为数组来访问。如果你非常想避免使用 $aref->[0],可以尝试使用 @$aref[0] 代替,这样更清晰易懂。 - flesk
3
$aref[0] 的意思是“数组 @aref 的第一个元素”,但 $aref 是一个标量,包含指向另一个数组的引用,所以你需要先使用 -> 运算符来解引用它。 - Alex
3
"$$aref[0]" 也是一个可行的选项。 - TLP
我以为我在上面的注释中写了那个,但再看一遍,我发现我不小心使用了一个元素数组切片。:$ - flesk

6

这行代码

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], @_;
}

1
更简单地写成
  sub popmany 
  {
    map $_->[0], @_;
  }

请在codegolf问题中留下简单的代码。简单的代码是正确的选择,而这并不是一条容易的路。 - user6839822

1
sub popmany { 
    my @retlist = (); 
    for my $aref (@_) { #1 
        my $arrele = @$aref[0]; #2 
        push @retlist , $arrele#3 
    } 
    return @retlist; 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接