【问题标题】:Perl Modifying Reference Array via Push in SubroutinePerl 通过 Push in 子程序修改引用数组
【发布时间】:2016-01-26 09:14:13
【问题描述】:

我有一个要在子例程中修改的数组。它通过引用作为第二个参数传入。它似乎没有被修改,因为当我返回时,数组的长度与原始值相同。

这是我所做的一个简单的说明:

sub readLine
{
    my @array = @{$_[1]};
    #Push value onto array
    push @array, $myvalue;
}

sub main 
{
    my @array = ();
    #Pass by reference
    readLine($argument1, \@array);

    print @array; #Prints 0
}

我是 Perl 的新手,所以如果我这样做正确,请告诉我。我阅读了类似问题的答案,但它仍然没有为我打印正确的值 (1)。我安装了最新版本的 Perl。

【问题讨论】:

    标签: arrays perl pass-by-reference


    【解决方案1】:

    原始数组没有被修改,因为您将其复制到readLine() 中的@array。你需要做这样的事情,你在实际参考而不是副本上采取行动:

    use strict;
    use warnings;
    use Data::Dump;
    
    main();
    
    sub main {
        my @array;
        foo(\@array, 'bar', 'bat', 'baz');
        dd(@array);
    }
    
    sub foo {
        my ($aref, @args) = @_;
        push(@$aref, @args);
    }
    

    输出:

    ("bar", "bat", "baz")
    

    【讨论】:

      【解决方案2】:

      您在readLine 子例程中声明了一个词法(局部)变量,并且在子例程结束时它的值被丢弃。您永远不会使用您传入的实际数组,因为您制作了它的副本。

      不过,您可以直接轻松地推入引用的数组。

      push @{$_[1]}, $myvalue;
      

      您编写的代码预计 $myvalue 已从天而降(或者它可能在某个全局范围内定义?)但假设它有一个值,该值将被推送到引用的数组中。

      【讨论】:

      • $myvalue 来自哪里?
      猜你喜欢
      • 1970-01-01
      • 2012-06-04
      • 2021-10-14
      • 2016-04-02
      • 2013-10-21
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 2010-09-23
      相关资源
      最近更新 更多