2015-10-27 81 views
1

我有一個數組,我想在子程序中修改。它作爲第二個參數通過引用傳入。它似乎沒有被修改,因爲當我返回時,數組的長度與原始值相同。Perl通過推入子程序修改參考數組

下面是我所做的一個片段:

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。

回答

4

您聲明詞彙(本地)變量中你的readLine子程序,並且在子程序結束時它的值被丟棄。你永遠不會使用你傳入的實際數組,因爲你創建了它的副本。

雖然您可以直接輕鬆地將其推入引用數組中。

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

您作爲編寫的代碼預計$myvalue已經跌出天空的(也可能是它在全球範圍內定義的地方嗎?)不過,假設它有一個值,該值將被壓入引用數組。

+0

'$ myvalue'從哪裏來? –

7

原始數組未被修改,因爲您將其複製到@arrayreadLine()中。你需要做這樣的事情,而不是,你在實際的參考,而不只是一個拷貝作用,其中:

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")