【问题标题】:Perl script to get the first element of arrays passed as referencePerl 脚本获取作为引用传递的数组的第一个元素
【发布时间】:2011-11-11 07:33:51
【问题描述】:

我想通过传递大约 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

这毫无意义。

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

【问题讨论】:

  • popmany 作为名称具有双重误导性。 pop 删除数组的最后一个元素并返回它。这将返回 first 值而不更改数组。

标签: arrays perl


【解决方案1】:

在这里:

my $arrele = @$aref;

您要求 perl 将 @{$aref} 放入标量上下文中,这将返回 $aref 指向的数组的长度(其中的元素数)。

改为尝试:

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

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

【讨论】:

  • 谢谢...你能告诉我为什么我的 $arrele = $aref[0];不工作?
  • 因为 $aref 是一个数组引用,而您正试图将其作为数组访问。如果您非常想避免使用$aref->[0],请尝试使用@$aref[0],这样会更清晰。
  • $aref[0] 表示“数组@aref 的第一个元素”,但 $aref 是一个标量,其中包含对其他数组的引用,因此您需要先使用 -> 取消引用它。跨度>
  • $$aref[0] 也是一个可行的选择。
  • 我以为我在上面的评论中写过,但再看一遍,我发现我不小心使用了一个元素数组切片。 :$
【解决方案2】:

线

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

【讨论】:

    【解决方案3】:

    更简单的写成

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

    【讨论】:

    • 请给codegolf问题留下简单的代码。简单的代码是要走的路,这不是简单的方法。
    【解决方案4】:
    sub popmany { 
        my @retlist = (); 
        for my $aref (@_) { #1 
            my $arrele = @$aref[0]; #2 
            push @retlist , $arrele#3 
        } 
        return @retlist; 
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 2019-06-01
      • 2017-04-01
      • 2013-04-26
      相关资源
      最近更新 更多