2017-08-08 138 views
6

我對Perl相當陌生,最近生成了下面這段代碼。我已經對它進行了廣泛的測試,並且返回了期望的結果。然而,我只是想知道有更多Perl經驗的人是否可以爲我提供可用性方面的建議。用Perl聲明變量循環

基本上,我已經在for循環中用'my'關鍵字聲明瞭一個數組變量。然後,我在另一個數組變量中使用這個聲明的數組變量的地址,該數組變量已在前面提到的for循環之前聲明。基本的代碼結構如下所示:

my @Array_of_ALL_Vals; 
for my $iloop (0 .. 10){ 
    my @Array_Vals; 
    . 
    Code in here to populate @Array_of_Vals 
    . 
    push @Array_of_ALL_Vals,\@Array_Vals; 
} 

@Array_Vals變量通常每次都是不同的大小。此外,循環內定義的數組@Array_Vals不在代碼中的任何其他位置使用,並且對於for循環而言是本地的。

我關心的是在for循環中聲明數組。即使每次我假設對於每個循環迭代,變量的名稱都是相同的,它將被分配給不同的內存地址。它是否正確?

我認爲最好在for循環中向數組名稱添加一個增量器,這樣名稱每次都會不同(@Array_Vals1,@ Array_Vals2,...)。然後我可以將這些值推入@Array_of_ALL_Vals數組,並確保最終的數組值不會被覆蓋。然而,在做了一些搜索之後,我發現不鼓勵這種方法(包含變量的變量名)。

所以我想我問的是:我的方法使用相同的數組名稱爲每個循環迭代,然後將此數組的地址追加到一個新的數組(@Array_of_ALL_VALS)有效嗎?或者,循環數組(@Array_Vals)不斷被覆蓋的事實在執行完所有迭代之後是否搞亂了數組@Array_of_ALL_Vals(其中包含@Array_Vals數組的地址)的有效性?

的任何意見

Gauss76

+0

而不是回答,把它放在循環'print \ @Array_Vals「中,\ n」;'和'print'$ _ \ n「替代@Array_of_ALL_Vals;'在循環之後。 –

+2

請注意@Сухой27的評論 - 這是一個很好的問題,但是你可以自己弄明白。 – zdim

+0

謝謝...我會測試它。 – gauss76

回答

6

每次輸入你的循環時間非常感謝,你會得到一個名爲@Array_Vals一個全新的變量。這些變量中的每一個都將存儲在不同的內存部分,因此會有不同的參考。您可以通過在循環內打印對陣列的引用(print \@Array_Vals)來驗證此問題。

所以你有一個新的數組變量,然後你填充。然後你對該數組進行引用並將引用存儲在另一個數組中。然後我們在循環迭代結束時,@Array_Vals超出範圍並且不復存在。或者,相反,該變量的名稱不再存在。當我們在@Array_of_All_Vals中存儲了對@Array_Vals的引用時,Perl在內部做了一個註釋,該引用被存儲在別處(我們說「引用計數增加了」)。雖然引用計數不爲零,但Perl不會釋放用於存儲舊的@Array_Vals陣列的內存。

如果@Array_of_All_Vals數組超出範圍,那麼Perl會減少存儲在其元素中的所有引用的引用計數。舊的@Array_Vals陣列上的引用計數將變爲零,並且Perl的垃圾回收將在將來的某個時候自由重新使用該內存。

因此,您開發的機制可以保證正常工作。事實上,這是這種情況的推薦方法。

+0

太棒了!非常感謝戴夫,非常優雅地解釋! – gauss76