Perl包变量作用域疑问:创建、销毁时机及循环调用后的状态
Perl包变量生命周期问题
场景代码
主程序代码
while($somecondition){ require( 'people.pm' ); my $result = PERSON::stuff($args); }
PERSON包代码(people.pm)
package PERSON; our $name; our ... sub stuff { ... }
核心疑问
维护遗留代码时,需明确以下几点:
- 包变量
$name何时创建、何时被回收? - 循环结束后调用
PERSON::stuff()是否会使用新的包变量? - 调用一次包内函数后,包变量是否会存活至程序结束?
问题解答
包变量
$name的创建与回收时机:
第一次执行require 'people.pm'时,PERSON包会被加载,此时our $name声明的包变量就会被创建。Perl的包变量属于全局命名空间,正常情况下不会自动回收,除非你手动执行undef $PERSON::name或者删除包符号表中的对应项,否则它会一直存在到程序退出。循环结束后调用
PERSON::stuff()是否使用新的包变量:
不会。Perl的require机制是只加载一次文件——第一次循环加载完people.pm后,后续循环里的require语句会直接跳过,不会重新加载包,因此整个程序运行期间,PERSON包的$name只有唯一的一份。不管循环内调用多少次stuff,还是循环结束后再调用,用的都是同一个变量。包变量是否存活至程序结束:
是的。只要不手动销毁,包变量会一直存活到整个Perl程序执行完毕退出。哪怕后续不再调用PERSON包的任何函数,它也会保留在全局符号表中,直到程序结束才会被系统回收内存。
内容的提问来源于stack exchange,提问作者Daklean
相关产品推荐
相关产品推荐

