2009-07-07 136 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有正确的想法。变量名称具有范围,数据不具有。询问匿名数组的范围就像询问一个字符串的范围。只要有一个变量提供对其的直接或间接(即参考)访问,就可以访问字符串。