请教perl中my和local的区别?

OpenGL 2000-02-23 06:48:00
加精
如题!
...全文
4569 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
netken 2001-08-13
  • 打赏
  • 举报
回复
其实对于 my 和 local ,主要还是和 typeglob 有关系
对于一个 perl 中的变量,都有一个 符号表 与之对应
比如有 $perl = 'a'; @perl = qw / a b c d /;%perl = ...;sub perl {};open(perl,...);
看起来其为同名,不同类型的各种符号
但在perl中,他们都是存放在一个的符号表中的同一个表项中的,都是在名为 perl 的表项。
然后通过一个 typeglob 的数据结构来来把各种值分开,typeglob 也就是 *perl
我们不妨做个实验
$a = 'a';@a = qw / a b c /;
print $a."\t".@a;
print $b."\t".@b;
*b=*a;
print $b."\t".@b;
当我们执行完了 *b=*a;也就是typeglob赋值操作以后,等于说在这个代码段中又建立了一个 符号表项 ,也就是 b,那么这个符号表项所指向的 typeglob 和 a 一样。
这样,等于说就同时建立了一个和a关联的b的变量,包括 $b,@b
对于local操作,其实是在这个代码段前,先把此 typeglob 中的各个项的值保存,然后在进行对这些变量的操作和运算,这样的话在该代码段结束前,这些变量“看起来”好象没什么变化,等到该代码段结束了,local的变量就会取出原来备份的值,在替换了现有的值。
而 my 呢?
my 并没有用到 typeglob 和 符号表,my 是在每个代码段都建立一个特殊的地方来专门存储这些变量,而且my的变量中没有了 typeglob 的概念,也就是说 my 中的 $a , @a 都是按一定的顺序存放到一个内存区中的,不会出现 *b=*a 的情况了。而在代码段结束的时候,只要这些变量的引用记数为0,就释放这些变量。
加之 my 特有的某些技术,所以速度一般要比较快,所以在代码段中,除非特殊的情况,一般常用my 来定义变量,当然,如果要传递一个句柄,是不能用 my 的。不用我说为什么了吧?o)
mahui 2000-09-25
  • 打赏
  • 举报
回复
my 只能在当前函数内部有效
local 可以在当前函数的下一级函数有效
std_ream 2000-03-21
  • 打赏
  • 举报
回复
my和local声明的变量都限定在所在的块范围内,不同的是
local关键字声明的变量在块范围内的子程序也能使用。
chenjp 2000-03-17
  • 打赏
  • 举报
回复
简单的举例而言,
对于sub A,
对于local变量,可以被A所调用的其他模块直接引用。
对于my变量,则只能在sub A中使用,不能被A所调用的其他模块直接引用。
2bao 2000-02-26
  • 打赏
  • 举报
回复
使用my的情况在于你在程序中包含了:user strict这个包

这个包就是用来规范化的程序设计的,这样的变量不会冲突,不会影响全局变量

建议你去买电子工业出版社出版的《perl详解》
DOU 2000-02-24
  • 打赏
  • 举报
回复
在perl中也有一个local函数,my则是操作符
local(EXPRESSION),my(EXPRESSION) ,my EXPRESSION
函数local生成所传递的全局表达式EXPRESSION的局部实例。该函数通常在向子例程传递参数时使用,这可确保传递的值不受子例程中变量的不利影响

my与local函数间有一些区别。local函数在创建全局变量的一个局部实例后即可将它传递给任何子例程并继续进行局部初始赋值。运算符my以与local函数同样的方法创建一次局部实例,然而,由my创建的局部实例不能传递给其它子例程,传递给子例程进行运算的将是全局值而非局部引用值。

懂的不多,仅供参考
DOU 2000-02-23
  • 打赏
  • 举报
回复
在函数定义中,使用my关键字来确保用户定义函数中所使用的变量名不与任何其它同名的全局变量冲突,它使其后面的变量成为通常语言所谓的local变量
缺省情况下,perl函数中的变量是全局变量。

2,204

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 CGI
社区管理员
  • CGI社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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