Chinaunix

标题: perl 变量的可见性,生命周期,以及分配和回收时刻? [打印本页]

作者: tianqio    时间: 2008-02-19 17:25
标题: perl 变量的可见性,生命周期,以及分配和回收时刻?
最近刚接触到perl,没有看什么书,做了一些例子,对这几个问题不是很清楚,只知道my声明的变量是lexical scope,与其他语言差不多,local声明的变量是动态的作用域,但my声明的变量什么时候被回收呢?类似与c里面的堆栈变量?但如果我用my声明了一个hash,但是确把这个hash的引用传了出去,这时又是怎样的情况?perl的变量是类似java那样全部放在堆上的还是另外的情况?perl怎样回收变量?google了很多天,大致翻了一些英文的perl资料,没有找到一个详细论述这方面的,头疼中....只好来这里发帖问了

谢谢,或者告诉在那里可以查到相关的资料,非常感谢。
作者: flw    时间: 2008-02-19 17:54
Perl 高级编程
作者: 小菜9527    时间: 2008-02-19 18:07
原帖由 flw 于 2008-2-19 17:54 发表
Perl 高级编程

有些东西看不太懂。。。。
作者: flw    时间: 2008-02-19 18:12
原帖由 小菜9527 于 2008-2-19 18:07 发表

有些东西看不太懂。。。。

那说明你基础差。
不过也没关系,我觉得语言这个东西,从宏观面就可以说得清楚,不需要研究它的实现,当然研究一下还是有帮助的。
作者: tianqio    时间: 2008-02-19 18:14
刚刚找到这本书的英文版,大概看了一下第一章,还是有一些疑问,书里讲“A variable is a name and value pair”,也就是说一个变量本身就是一个引用了,是这样的吗?那引用是不是就相当于c语言里的二级指针了?
$a = "hello";
$b = $a;  这句是让b指向hello?
$b = \$a; 这句是让b指向a?

谢谢。

另外这样的代码效果是怎样的
my $a;
while(something){
  $a = somevalue;
}
如果somevalue只有$a引用,每次while循环回释放它吧?
谢谢
作者: flw    时间: 2008-02-19 18:25
$a = "hello";
$b = $a;  这句是让b指向hello?
$b = \$a; 这句是让b指向a?

这个说的非常对。我理解你的意思。
不过各位看官在看到这个对话时,注意揣摩上下文。
因为这里用词不是很严谨。

至于下面的那一段儿,因为你写的代码是错的,因此我不知道你的意思。
作者: tianqio    时间: 2008-02-19 18:32
my $a;
while(something){
  $a = somevalue;
}

错了?
我的意思是说如果每次循环时,把一个新值赋给$a,当下一次给$a赋值时,$a先前所指向的值会不会被回收?如果这个值只有$a指向他
其实就是如下的意思:
$a = somevalue_a;
$a = somevalue_b; //执行到这里时,somevalue_a的应该被释放了吧?如果没有其他变量引用它?
谢谢。
作者: flw    时间: 2008-02-19 18:37
你的理解非常到位,就是这样的,一点儿也没错。
作者: tianqio    时间: 2008-02-19 19:49
perl里面所有的value都是不可修改的?当修改变量值时实际上另外分配了一个value,perl太神奇了
代码如下:
my $a = 5;
my $b = $a;
$a++;
print "a = $a,b = $b\n";


my $c = "hello";
my $d = $c;
$c .= ",world";
print "c = $c, d = $d\n";

my @e = (1,2,3,4);
my @f = @e;
$e[1] = 6;

print "e = @e  f = @f\n";

结果如下:
a = 6,b = 5
c = hello,world, d = hello
e = 1 6 3 4  f = 1 2 3 4

数组相当与c里面的装指针的数组,修改某个元素就让这个元素指向新的值?还是整个数组一起改了?
作者: flw    时间: 2008-02-19 20:32
> perl里面所有的value都是不可修改的?当修改变量值时实际上另外分配了一个value,perl太神奇了

倒也不是这么说,如果你对这个感兴趣,你可以看看 perldoc Devel::Peek。
这些都属于 Perl 的内部实现,Perl 并不保证什么。
例如:
  1. D:\MoChou>uhead -8 ttt.pl
  2. use Devel::Peek;

  3. $str = "Hello";
  4. print Dump( $str );
  5. $str = "World";
  6. print Dump( $str );

  7. __END__

  8. D:\MoChou>ttt
  9. SV = PV(0x27616c) at 0x2760e8
  10.   REFCNT = 1
  11.   FLAGS = (POK,pPOK)
  12.   PV = 0x18225bc "Hello"\0
  13.   CUR = 5
  14.   LEN = 8
  15. SV = PV(0x27616c) at 0x2760e8
  16.   REFCNT = 1
  17.   FLAGS = (POK,pPOK)
  18.   PV = 0x18225bc "World"\0
  19.   CUR = 5
  20.   LEN = 8

  21. D:\MoChou>
复制代码

可以看出,这里只是做了一个 strcpy 罢了。
但是如同 C 中一样,"Hello" 和 "World" 本来就是两个不同的常量。
作者: tianqio    时间: 2008-02-20 10:48
谢谢




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2