【perl】关于包中的my变量的作用域问题
时间:2011-12-19
来源:互联网
包代码:
Perl code
调用代码:
Perl code
运行结果:
$perl test.pl
new a
all_data is abc
new b
all_data is abc#123
my变量通常是临时的或只在程序的局部可访问,为什么我创建了a , b两个对象,他们中的 my @all却是共享存储的?
Perl code
#!/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;
调用代码:
Perl code
#!/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却是共享存储的?
作者: ace_fei 发布时间: 2011-12-19
首先你要理解词法范围的含义。
我的理解,词法范围主要是说变量名这个词汇被访问的范围,这个概念不等同于C/C++中的变量作用域。前者是变量名的使用范围,后者是变量的内存的生命周期和访问的范围的概念。
在perl中,实际的对象和变量是通过引用计数器来实现回收的,无论你声明为那种方式(my local our)的变量,只要引用计数不为0,就不会被释放。
你通过my 只是声明了一个词法范围的名字来引用这个对象。
对于包来说,包只有一个,在包的范围内,你定义的@all对于整个包是可访问的,但@all的名字是不可被外界访问的,因为是my。
不同包的对象的区分,仅在于构造函数中bless的my所声明的引用。
我的理解,词法范围主要是说变量名这个词汇被访问的范围,这个概念不等同于C/C++中的变量作用域。前者是变量名的使用范围,后者是变量的内存的生命周期和访问的范围的概念。
在perl中,实际的对象和变量是通过引用计数器来实现回收的,无论你声明为那种方式(my local our)的变量,只要引用计数不为0,就不会被释放。
你通过my 只是声明了一个词法范围的名字来引用这个对象。
对于包来说,包只有一个,在包的范围内,你定义的@all对于整个包是可访问的,但@all的名字是不可被外界访问的,因为是my。
不同包的对象的区分,仅在于构造函数中bless的my所声明的引用。
作者: fibbery 发布时间: 2011-12-19
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28