Chinaunix首页 | 论坛 | 博客
  • 博客访问: 55387
  • 博文数量: 12
  • 博客积分: 935
  • 博客等级: 准尉
  • 技术积分: 230
  • 用 户 组: 普通用户
  • 注册时间: 2005-05-04 18:01
文章分类

全部博文(12)

文章存档

2008年(12)

我的朋友
最近访客

分类:

2008-08-29 20:33:44

如果你习惯了c这样scope划分严格整齐的语言,碰到perl就头大了...:
 
1.

package A;
$apple = "apple from a";
package B;
$apple = "apple from b";
print '$apple: ',$apple,"\n";
print '%A::-> ',$_,"\n" for (keys %A::);
print '%B::-> ',$_,"\n" for (keys %B::);

 

结果是什么?

$apple 当然该输出是 apple from b

而package A 和 B 都存在名字

这个容易接受

我们修改一下

 

2.

package A;
our $apple = "apple from a";
package B;
$apple = "apple from b";
print '$apple: ',$apple,"\n";
print '%A::-> ',$_,"\n" for (keys %A::);
print '%B::-> ',$_,"\n" for (keys %B::);

 

ok,这下我们给package A下面多了一个 our,结果又如何呢?

$apple 输出当然还是 "apple from b",但是这个时候 package B中没有名字 !意思是,

$apple 名字查找是在 词法范围内找到的...而非全局,这个时候package A中有名字,这时候

$A::apple 已经被修改掉了...

 

再来

3.

package A;
my $apple = "apple from a";
package B;
$apple = "apple from b";
print '$apple: ',$apple,"\n";
print '%A::-> ',$_,"\n" for (keys %A::);
print '%B::-> ',$_,"\n" for (keys %B::);

 

这下package A,B中都没有名字,纯一个词法范围的变量.

上面的例子可以配合在package B下面加 my  和 our 观察结果.

 

然后再来最后两个bt的测试:

4.

package A;
my $apple = "apple from a";
package B;
$apple = "apple from b";
print '$apple: ',$apple,"\n";
print '%A::-> ',$_,"\n" for (keys %A::);
print '%B::-> ',$_,"\n" for (keys %B::);
print '$A::apple ',$A::apple if exists$A::{apple}

结果是:

$apple: apple from b
%A::-> apple
$A::apple

 

这下结果奇怪了....到底 $A::apple 是在是不在?注意和上面的例子3对比,这个问题应该是

因为perl的实现方式带来的奇怪现象

最后

 

5.

package A;
our $apple = "apple from a";
package B;
$apple = "apple from b";
print '$apple: ',$apple,"\n";
print '%A::-> ',$_,"\n" for (keys %A::);
print '%B::-> ',$_,"\n" for (keys %B::);
print '$A::apple ',$A::apple if exists$A::{apple}

 

结果是:

$apple: apple from b
%A::-> apple
$A::apple apple from b

这是容易理解.

 

最奇怪的在例子 4严格上来说,package A中不该存在那个名字,但是实际上出现了,只是没

值,但是如果不去用print那一句就没有,这应该是因为perl实现scope的方式带来的问题,因为print句子中用到了$A::apple这个名字.

使用 use strict可以让你少碰到这些怪事.

ps:

Programming Perl  这本书实在是郁闷,罗嗦了点,扯那么多事情干什么,往往举个例子让人更不明白想说啥了.如果阅读中文翻译更要小心,有的地方翻译有错误,在说到多字节问题的时候还直接说反了.而且因为英文原来比较罗嗦,扯了许多乱七八糟的事,最好是对照着看.

 

在关于名字查找和package方面说的不是很清楚,比如:

A package declaration, oddly enough, is itself lexically scoped, despite the fact that a package is a global entity. But a package declaration merely declares the identity of the default package for the rest of the enclosing block. Undeclared, unqualified variable names are looked up in that package. In a sense, a package is never declared at all, but springs into existence when you refer to something that belongs to that package. It's all very Perlish.

包定义,古怪的是,其本身为词法范围,尽管包本身是一个全局实体,但是包申明只是为闭合块

的剩余部分申明了默认的包识别符,没有申明的,没有限定的变量在该包中进行查找.从某种意义上来说,包就从来没被申明过,但是当你用来引用一些属于包的东西的时候它就蹦出来了,这都是perl的风格...

 

我真的很想知道,大家读完这段话有啥感想?还不如给我把perl内部实现pacakge的方式给我画个图出来,这样说来说去全当废话了.....

阅读(927) | 评论(0) | 转发(0) |
0

上一篇:病得一塌糊涂...

下一篇:又一次x光...

给主人留下些什么吧!~~