perl 变量的可见性,生命周期,以及分配和回收时刻?

perl 变量的可见性,生命周期,以及分配和回收时刻?

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

谢谢,或者告诉在那里可以查到相关的资料,非常感谢。
Perl 高级编程


QUOTE:
原帖由 flw 于 2008-2-19 17:54 发表
Perl 高级编程

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


QUOTE:
原帖由 小菜9527 于 2008-2-19 18:07 发表

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

那说明你基础差。
不过也没关系,我觉得语言这个东西,从宏观面就可以说得清楚,不需要研究它的实现,当然研究一下还是有帮助的。
刚刚找到这本书的英文版,大概看了一下第一章,还是有一些疑问,书里讲“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循环回释放它吧?
谢谢
$a = "hello";
$b = $a;  这句是让b指向hello?
$b = \$a; 这句是让b指向a?

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

至于下面的那一段儿,因为你写的代码是错的,因此我不知道你的意思。
my $a;
while(something){
  $a = somevalue;
}

错了?
我的意思是说如果每次循环时,把一个新值赋给$a,当下一次给$a赋值时,$a先前所指向的值会不会被回收?如果这个值只有$a指向他
其实就是如下的意思:
$a = somevalue_a;
$a = somevalue_b; //执行到这里时,somevalue_a的应该被释放了吧?如果没有其他变量引用它?
谢谢。
你的理解非常到位,就是这样的,一点儿也没错。
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里面的装指针的数组,修改某个元素就让这个元素指向新的值?还是整个数组一起改了?
> perl里面所有的value都是不可修改的?当修改变量值时实际上另外分配了一个value,perl太神奇了

倒也不是这么说,如果你对这个感兴趣,你可以看看 perldoc Devel::Peek。
这些都属于 Perl 的内部实现,Perl 并不保证什么。
例如:

[Copy to clipboard] [ - ]
CODE:
D:\MoChou>uhead -8 ttt.pl
use Devel::Peek;

$str = "Hello";
print Dump( $str );
$str = "World";
print Dump( $str );

__END__

D:\MoChou>ttt
SV = PV(0x27616c) at 0x2760e8
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x18225bc "Hello"\0
  CUR = 5
  LEN = 8
SV = PV(0x27616c) at 0x2760e8
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x18225bc "World"\0
  CUR = 5
  LEN = 8

D:\MoChou>

可以看出,这里只是做了一个 strcpy 罢了。
但是如同 C 中一样,"Hello" 和 "World" 本来就是两个不同的常量。