首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

【perl】关于包中的my变量的作用域有关问题

2012-03-20 
【perl】关于包中的my变量的作用域问题包代码:Perl code#!/bin/perlpackage testuse Data::Dumpermy @all

【perl】关于包中的my变量的作用域问题
包代码:

Perl code
#!/bin/perlpackage test;use Data::Dumper;my @all;sub new(){    my $ref = shift;    $class = ref $ref || $ref;    my $self = {};    bless $self, $class;}sub test(){    my $self = shift;    my $data = shift;    push @all, $data;    print "all_data is ", (join '#', @all), "\n";}1;


调用代码:
Perl code
#!/usr/bin/perluse strict;use warnings;use test;use Data::Dumper;print "new a\n";my $a = test->new();$a->test("abc");print "new b\n";my $b = test->new();$b->test("123");


运行结果:
$perl test.pl
new a
all_data is abc
new b
all_data is abc#123

my变量通常是临时的或只在程序的局部可访问,为什么我创建了a , b两个对象,他们中的 my @all却是共享存储的?

[解决办法]
首先你要理解词法范围的含义。

我的理解,词法范围主要是说变量名这个词汇被访问的范围,这个概念不等同于C/C++中的变量作用域。前者是变量名的使用范围,后者是变量的内存的生命周期和访问的范围的概念。

在perl中,实际的对象和变量是通过引用计数器来实现回收的,无论你声明为那种方式(my local our)的变量,只要引用计数不为0,就不会被释放。
你通过my 只是声明了一个词法范围的名字来引用这个对象。

对于包来说,包只有一个,在包的范围内,你定义的@all对于整个包是可访问的,但@all的名字是不可被外界访问的,因为是my。

不同包的对象的区分,仅在于构造函数中bless的my所声明的引用。


[解决办法]
如果要跟C中的概念对应的话,它更像是文件范围内的静态变量,也就是你说的static变量;
C++的类中的静态成员变量。

不能说是共享的,因为只有一个。你可以理解为,每次调用new函数的时候,你只是创建了引用变量,并且,将这个变量赋予了一组函数,这些函数就是包中定义的函数。

热点排行