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

ace_fei 2011-12-19 10:56:21
包代码:
#!/bin/perl
package 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;


调用代码:
#!/usr/bin/perl
use 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却是共享存储的?
...全文
224 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ace_fei 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 iambic 的回复:]

引用 3 楼 ace_fei 的回复:
我感觉它是个static变量。

static还是non-statis对于这个问题没有本质区别。
[/Quote]

有人告诉我,@all是在子函数之外声明的,是个闭包变量。
fibbery 2011-12-20
  • 打赏
  • 举报
回复
如果要跟C中的概念对应的话,它更像是文件范围内的静态变量,也就是你说的static变量;
C++的类中的静态成员变量。

不能说是共享的,因为只有一个。你可以理解为,每次调用new函数的时候,你只是创建了引用变量,并且,将这个变量赋予了一组函数,这些函数就是包中定义的函数。
ace_fei 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 iambic 的回复:]

引用 3 楼 ace_fei 的回复:
我感觉它是个static变量。

static还是non-statis对于这个问题没有本质区别。
[/Quote]
但是我看书上说,闭包需要有匿名子函数,是不是bless在实现的时候会使用到匿名子函数?
iambic 2011-12-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ace_fei 的回复:]
我感觉它是个static变量。
[/Quote]
static还是non-statis对于这个问题没有本质区别。
ace_fei 2011-12-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fibbery 的回复:]

首先你要理解词法范围的含义。

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

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

不知道我理解的对不对,你的意思是说,无论怎样做,因为包只有一个,我只要new这个包的对象,他们的@all就是共享的?

ace_fei 2011-12-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 iambic 的回复:]

简单的讲,这叫全局变量。和C语言里的没什么本质区别。
[/Quote]
我感觉它是个static变量。
iambic 2011-12-19
  • 打赏
  • 举报
回复
简单的讲,这叫全局变量。和C语言里的没什么本质区别。
fibbery 2011-12-19
  • 打赏
  • 举报
回复
首先你要理解词法范围的含义。

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

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

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

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

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧