代码之家  ›  专栏  ›  技术社区  ›  sud03r

Perl中的变量范围

  •  2
  • sud03r  · 技术社区  · 15 年前

    在下面的代码中,$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
    
    5 回复  |  直到 15 年前
        1
  •  15
  •   Alex Feinman    15 年前

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

    上次我检查时,Perl使用引用计数进行垃圾收集,这样在对数组的最后一次引用超出作用域之前(例如,如果在示例末尾取消设置$ref),就不会对该数组进行垃圾收集。

        2
  •  8
  •   Chas. Owens    15 年前

    亚历克斯·费曼有正确的想法。变量名有作用域,数据没有作用域。请求匿名数组的作用域就像请求字符串的作用域。只要有一个变量提供对字符串的直接或间接(即引用)访问,就可以访问该字符串。

        3
  •  6
  •   Tom Jefferys    15 年前

    如果我正确理解这个问题,$ref的范围是file2.pl的全部内容。

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

        4
  •  2
  •   cube    15 年前

    只要有人提到它,它就可以使用。

        5
  •  0
  •   Adrian Dunston    15 年前

    它的作用域仅限于do-something子例程,在该子例程中创建,直到它返回并存储在$ref中。一旦它存储在file2.pl中的$ref中,它就位于file2.pl中的任何位置。