免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2110 | 回复: 8
打印 上一主题 下一主题

关于包中的my变量的作用域问题 [复制链接]

论坛徽章:
1
丑牛
日期:2014-02-14 17:07:04
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-19 10:35 |只看该作者 |倒序浏览
包代码:
  1. #!/bin/perl
  2. package test;
  3. use Data::Dumper;
  4. my @all;
  5. sub new()
  6. {
  7.     my $ref = shift;
  8.     $class = ref $ref || $ref;
  9.     my $self = {};
  10.     bless $self, $class;
  11. }

  12. sub test()
  13. {
  14.     my $self = shift;
  15.     my $data = shift;
  16.     push @all, $data;
  17.     print "all_data is ", (join '#', @all), "\n";
  18. }

  19. 1;
复制代码
调用代码:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use test;
  5. use Data::Dumper;

  6. print "new a\n";
  7. my $a = test->new();
  8. $a->test("abc");

  9. print "new b\n";
  10. my $b = test->new();
  11. $b->test("123");
复制代码
运行结果:
  1. $perl test.pl
  2. new a
  3. all_data is abc
  4. new b
  5. all_data is abc#123
复制代码
my变量通常是临时的或只在程序的局部可访问,为什么我创建了a , b两个对象,他们中的 my @all却是共享存储的?

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2011-12-19 11:16 |只看该作者
不懂 closure 那也该知道类变量吧,就是那个意思

论坛徽章:
0
3 [报告]
发表于 2011-12-19 12:21 |只看该作者
my变量通常是临时的或只在程序的局部可访问,为什么我创建了a , b两个对象,他们中的 my @all却是共享存储的?


你创建了个闭包,@all是在子函数之外声明的,是个闭包变量。
搜下我之前关于闭包的帖子。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
4 [报告]
发表于 2011-12-19 13:10 |只看该作者
我的头像怎么变成女人了

论坛徽章:
1
丑牛
日期:2014-02-14 17:07:04
5 [报告]
发表于 2011-12-19 14:59 |只看该作者
兰花仙子 发表于 2011-12-19 12:21
你创建了个闭包,@all是在子函数之外声明的,是个闭包变量。
搜下我之前关于闭包的帖子。

谢谢仙子,那篇文章讲的真好,应该加精的。

像我这种平时登录论坛的时间不多,上线只看精华区的人,真的是错过了很多好文章啊。

论坛徽章:
1
丑牛
日期:2014-02-14 17:07:04
6 [报告]
发表于 2011-12-19 15:10 |只看该作者
zhlong8 发表于 2011-12-19 11:16
不懂 closure 那也该知道类变量吧,就是那个意思

嗯,谢谢指点,我再去看看关于闭包的内容。

还是书看少了,我以为my变量只会在包内生效,看来我在需要每次new的时候给@all初始化一下。

论坛徽章:
1
丑牛
日期:2014-02-14 17:07:04
7 [报告]
发表于 2011-12-19 17:04 |只看该作者
兰花仙子 发表于 2011-12-19 12:21
你创建了个闭包,@all是在子函数之外声明的,是个闭包变量。
搜下我之前关于闭包的帖子。

我看了下书上关于闭包的说明,以及你的例子中,无一例外都会提到“匿名子函数”。
但是我写的程序里是没有用到匿名子函数,只有匿名散列。
那么,匿名子函数并不是形成闭包的必要条件?

包内只要有个子函数之外声明的my变量,然后包内的子函数中调用这个my变量,外部调用者new了这个包的对象,使用了其子函数,就形成了闭包。

论坛徽章:
0
8 [报告]
发表于 2011-12-19 18:53 |只看该作者
ace_fei 发表于 2011-12-19 17:04
我看了下书上关于闭包的说明,以及你的例子中,无一例外都会提到“匿名子函数”。
但是我写的程序里是没 ...

bless过程中其实就产生了这个匿名子函数。

论坛徽章:
1
丑牛
日期:2014-02-14 17:07:04
9 [报告]
发表于 2011-12-20 09:32 |只看该作者
兰花仙子 发表于 2011-12-19 18:53
bless过程中其实就产生了这个匿名子函数。

哦,这样我就懂了,再次感谢你的答复。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP