2008年(12)
分类:
2008-08-29 20:33:44
|
结果是什么?
$apple 当然该输出是 apple from b
而package A 和 B 都存在名字
这个容易接受
我们修改一下
2.
|
ok,这下我们给package A下面多了一个 our,结果又如何呢?
$apple 输出当然还是 "apple from b",但是这个时候 package B中没有名字 !意思是,
$apple 名字查找是在 词法范围内找到的...而非全局,这个时候package A中有名字,这时候
$A::apple 已经被修改掉了...
再来
3.
|
这下package A,B中都没有名字,纯一个词法范围的变量.
上面的例子可以配合在package B下面加 my 和 our 观察结果.
然后再来最后两个bt的测试:
4.
|
结果是:
$apple: apple from b
%A::-> apple
$A::apple
这下结果奇怪了....到底 $A::apple 是在是不在?注意和上面的例子3对比,这个问题应该是
因为perl的实现方式带来的奇怪现象
最后
5.
|
结果是:
$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的方式给我画个图出来,这样说来说去全当废话了.....