2009-07-07 137 views
2

在以下代碼中,由$ ref引用的匿名數組可用。perl中變量的範圍

 
mod1.pm: 
package mod1; 
sub do_something{ 
..... 
my $array_ref = ["elemnt1","elmnt2"] ; 
return $array_ref ; 
} 
1; 

file.pl 
use mod1; 
my $ref = mod1::do_something() ; 
print "$ref->[0] $ref->[1] " ; #works 
+0

你是否確定這有效?你不會在file1.pl結尾處返回1;``不會導出或導入`do_something`,因爲mod1位於一個名爲file1.pl的文件中,解釋器如何找到它? 在這裏查看關於模塊的簡短教程:http://perl.plover.com/Hello/ – Telemachus 2009-07-07 13:48:00

+0

我編輯了.. :) – sud03r 2009-07-07 13:54:37

+0

你應該upvote並接受正確的答案。 – 2009-07-08 22:05:33

回答

15

從這個問題,它聽起來像你正在努力爭取變量的範圍和參考指向的數據的持久性之間的差異。數據[「elemnt1」,「elmnt2」]被分配給變量($ array_ref),該變量在do_something結束時超出範圍。但是,因爲它被返回,所以有一個對數據的引用,並且即使$ array_ref超出作用域時它仍然存在。

我上次檢查時,perl使用了垃圾回收的引用計數,這樣數組就不會被垃圾收集,直到最後一個引用超出範圍,例如,如果你在你的末尾沒有設置$ ref例。

2

只要任何人有參考,它是可用的。

6

如果我理解正確的問題$ REF的範圍是所有file2.pl的

在do_something要創建一個匿名數組,所以它坐落在堆上,而不是任何部分範圍。所以引用可以被傳遞並在任何地方都可用,直到不再有引用指向它爲止。

0

它的作用域被限制在do_something子例程中,直到它被返回並存儲在$ ref中。一旦它存儲在file2.pl的$ ref中,它就在file2.pl的任何位置。

8

Alex Feinman有正確的想法。變量名稱具有範圍,數據不具有。詢問匿名數組的範圍就像詢問一個字符串的範圍。只要有一個變量提供對其的直接或間接(即參考)訪問,就可以訪問字符串。