在下面的代码中,$ 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
答案 0 :(得分:15)
从问题来看,您似乎正在努力应对变量范围与引用所指向的数据持久性之间的差异。数据[“elemnt1”,“elmnt2”]被分配给一个变量($ array_ref),该变量在do_something结束时超出范围。但是,因为它被返回,所以存在对数据的引用,即使$ array_ref超出范围,它也会持续存在。
上次我检查时,perl使用引用计数进行垃圾收集,这样在最后一次引用它之前,数组不会被垃圾收集,例如,如果你在示例结尾处取消设置$ ref
答案 1 :(得分:8)
答案 2 :(得分:6)
如果我正确理解了这个问题,那么$ ref的范围就是file2.pl
在do_something中,您正在创建一个匿名数组,因此它位于堆上,并且不属于任何范围。因此,引用可以传递,并且可以在任何地方使用,直到不再有引用指向它为止。
答案 3 :(得分:2)
只要有人引用它,它就可用。
答案 4 :(得分:0)
它的范围仅限于do_something子例程,在该子例程中创建它直到它返回并存储在$ ref中。一旦它存储在file2.pl中的$ ref中,它就在file2.pl。
中的任何位置