perl中的变量范围

sud*_*03r 2 perl scope

在下面的代码中,$ ref引用的匿名数组的范围是可用的.

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

Ale*_*man 15

从这个问题来看,你似乎正在努力解决变量范围与引用所指向的数据持久性之间的差异.数据["elemnt1","elmnt2"]被分配给一个变量($ array_ref),该变量在do_something结束时超出范围.但是,因为它被返回,所以存在对数据的引用,即使$ array_ref超出范围,它也会持续存在.

上次我检查时,perl使用引用计数进行垃圾收集,这样在最后一次引用它之前,数组不会被垃圾收集,例如,如果在示例结尾处取消设置$ ref.


Cha*_*ens 8

Alex Feinman有正确的想法.变量名称有范围,数据没有.询问匿名数组的范围就像要求字符串的范围一样.只要有一个变量提供对它的直接或间接(即引用)访问,就可以访问字符串.


Tom*_*rys 6

如果我正确理解了这个问题,$ ref的范围就是file2.pl

在do_something中,您正在创建一个匿名数组,因此它位于堆上,并且不属于任何范围.因此,引用可以传递,并且可以在任何地方使用,直到不再有引用指向它为止.