Chinaunix

标题: 和仙子等众高手一起探讨一个问题 [打印本页]

作者: 思平    时间: 2005-12-05 10:43
标题: 和仙子等众高手一起探讨一个问题
our %sym = (
    name => 'hoowa',
    age  => 28,
    sex  => 'man',
);

print ${*{$::{sym}}{HASH}}{name};
会打印出 hoowa,为什么?

[ 本帖最后由 思平 于 2005-12-5 20:25 编辑 ]
作者: fayland    时间: 2005-12-05 11:00
这个在  骆驼书 第十章 包 的符号表里有讲的。
作者: 思平    时间: 2005-12-05 11:13
原帖由 fayland 于 2005-12-5 11:00 发表
这个在  骆驼书 第十章 包 的符号表里有讲的。

不要这么早说出来嘛!
作者: xxgsky    时间: 2005-12-05 11:44
请问你指的"骆驼书"是哪一本啊?
作者: apile    时间: 2005-12-05 12:52
programming perl...
作者: 兰花仙子    时间: 2005-12-05 18:56
原帖由 思平 于 2005-12-5 10:43 发表
our %sym = (
    name => 'hoowa',
    age  => 28,
    sex  => 'man',
);

print ${*{$::{sym}}{HASH}}{name};
会打印出 hoowa,为什么?


不好意思,刚下班回来,看到你的帖子。
嘿嘿,这种基本语法的问题偶一眼就看明白的,不用您考啦!
作者: 兰花仙子    时间: 2005-12-05 18:59
Perl的本质,就是一切皆为符号,而符号的本质就是引用,所以perl的本质就是一切皆为引用。
这是仙子说的,大家有意见,可以在此反驳偶,嘿嘿。
作者: 思平    时间: 2005-12-05 18:59
不要打马虎眼,说!
作者: 兰花仙子    时间: 2005-12-05 19:12
原帖由 思平 于 2005-12-5 10:43 发表
our %sym = (
    name => 'hoowa',
    age  => 28,
    sex  => 'man',
);

print ${*{$::{sym}}{HASH}}{name};
会打印出 hoowa,为什么?



$::代表$main::
*sym{HASH}是个ref,等同于\%sym,最外围的${}反引用它。

有问题回头讨论哈,偶吃饭去了。
作者: xxgsky    时间: 2005-12-05 19:43
原帖由 兰花仙子 于 2005-12-5 18:59 发表
Perl的本质,就是一切皆为符号,而符号的本质就是引用,所以perl的本质就是一切皆为引用。
这是仙子说的,大家有意见,可以在此反驳偶,嘿嘿。


好高深啊!呵呵,可不可以说得明白一点呢?
作者: 思平    时间: 2005-12-05 20:03
我来说说,仙子看我说的对不对:

print ${*{$::{sym}}{HASH}}{name};

%:: 等同于 %main::
也就是一个哈希表,
其中存放着
  1. '符号名称' => 指向 typeglob 的引用
复制代码

这样子的一些条目,
这个哈希表实际上就是 main 包的符号表。

因为前面 our %sym 了,所以 sym 就是个符号,可以通过
$main::{sym} 也就是 $::{sym} 来访问指向 sym 这个 typeglob 的引用
因此用 *{$::{sym}} 这种方式就可以解引用,

解引用的结果,是一个 typeglob,
而 typeglob 本身也是又是一个哈希表,
其中存放着一些
  1. '值类型' => 值引用
复制代码

这样的条目,
HASH 是这个哈希表其中的一个 key(此外还有 SCALAR 等 key,不然怎么叫类型“团”呢?)
所以用 *{$::{sym}}{HASH}  这种方式就可以取出一个指向 sym 这个 typeglob 中,HASH 分量的值,实际上也就是 \%{$::{sym}},同时也就是 \%::sym,在本例中也就是 \%sym
然后最后用解哈希表的方法就可以取出 $sym{name}
  1. ${*{$::{sym}}{HASH}{name}
复制代码

作者: 思平    时间: 2005-12-05 20:05
以上我的解释过程中,有一个疑点,那就是,$main::{sym} 的类型到底是 GLOB 还是 REF of GLOB?
再或者 GLOB 和 REF of GLOB 根本就是一个类型?
作者: 思平    时间: 2005-12-05 20:10
结论:Perl 5 的 GLOB 是个潜在的数据类型,不像 HASH SCALAR ARRAY CODE 等数据类型那样明显,
而它的语法,也很奇特:看上去像个 HASH,但是访问的方法又不像 HASH,我本来试图从 Perl5 语法的角度把它解释通,
但是仍然有疑点,实在不行,就只好不求甚解,
像仙子般给自己说:
  1. *pkg::sym{HASH}               # 和 \%pkg::sym 一样
复制代码

更何况这句话是 Larry Wall 本人说的,所以即使是拿来当“金科玉律”,亦并无不可。
作者: 思平    时间: 2005-12-05 20:15
我感觉,GLOB 对于 LarryWall 来说,
更像是一个内部使用的数据结构/数据类型,
但是不知道怎么就给公布出来了,
因此,它看起来就怪怪的。
从一个优美的语言的角度来讲,是不应该出现这种畸形的东西的,
可惜 Perl 的目标不是优美的语言,而是“能完成任务”的语言,
于是这种怪怪的东西就越来越多……

如果我设计一种语言,一定要避免这些问题。凭心而论,这是语言的污点。
作者: 思平    时间: 2005-12-05 20:21
不知道 Perl5 的哪本比较权威的书或者文档或者手册,
能够解释
  1. our %hash = ( a=>1 );
  2. my $glob = *hash;
复制代码

这个语法?
将一个 glob 赋值给一个标量,那么这个语句又是什么上下文?
等号两边的数据类型又怎么匹配?怎么解释?

作为一种语言来讲,如果需要用它的实现来解释,而不是用它的文法来解释,
那么这个语言就不是一个语言,而是一个工具。

[ 本帖最后由 思平 于 2005-12-6 10:30 编辑 ]
作者: apile    时间: 2005-12-06 08:36

  1. #!/usr/bin/perl

  2. our %hash = ( a=>1);
  3. my $glob = *hash;
  4. print ${$glob}{a}."\n";
复制代码

你的语法错误....
{} 回传的是一个ref to hash的引用....你把他负值给hash...是会有问题的....
$glob其实就是等於一个ref to typeglob 也可以把他看成pointer...
透过${$glob}可以将$glob指向hash的实际位址,然後
你就可以利用${$glob}{a}取值...
用C的pointer可以很容易解释这些问题 ...
只是有些在C里面不合道理的.type cast问题...在perl是正确的.不需要理会type cast问题....
作者: 思平    时间: 2005-12-06 10:38
to apile 前辈:
1, apile 前辈写道
你的语法错误....
{} 回传的是一个ref to hash的引用....你把他负值给hash...是会有问题的....

非常抱歉,手误,已改正。

不过我的疑问并不是“这句话是什么意思”,因为它的意思我是知道的。
我只是想知道,这个语法,从 Perl 的角度,该如何去自圆其说。
注:Perl 里面最起码的一个规则就是,$ 表示一个量,@ 表示多个量。
$glob 经过赋值之后,到底是几个量?(答曰:一个 GLOB)
GLOB 到底是 HASH 还是 REF?

2, apile 前辈的意思是说:
$glob其实就是等於一个ref to typeglob 也可以把他看成pointer...

这个是错误的,
请看下面:
  1. print ref $glob, "\n";
  2. print ref \$glob, "\n";
复制代码

前者打印空格,而后者打印 GLOB,
由此可见,$glob 是一个 GLOB 而不是 REF of GLOB

3, 另外 apile 前辈说:
透过${$glob}可以将$glob指向hash的实际位址

也是错误的。
${$glob} 取到的并非是指向 hash 的实际地址。
而是 $glob 这个 GLOB 中,其中标量分量的值。
请看下面:
  1. our $hash = 'not_a_hash';


  2. our %hash = ( a=>1 );
  3. my $glob = *hash;
  4. print ${$glob};
  5. __END__
  6. output is 'not_a_hash'
复制代码


4, apile 前辈还说:
你就可以利用${$glob}{a}取值...

从这一点来看,$glob 更像一个 ref of hash,而不是你前面所说的 ref of typeglob
请看下面:
  1. our %hash = ( a => 1 );
  2. my $glob = \%hash;
  3. print ${$glob}{a};
  4. __END__
  5. output is '1';
复制代码

在这短短的几行之间,似乎已经自相矛盾了。

5, apile 前辈最后说:
用C的pointer可以很容易解释这些问题 ...
只是有些在C里面不合道理的.type cast问题...在perl是正确的.不需要理会type cast问题..

这个和 type cast 没关系。
C 里面需要 type cast,那是因为 C 的类型太多了(可以自定义 N 多)
Perl 里面不需要,是因为 Perl 的类型太少了。
Perl 是不允许 type cast 的,Perl 把 C 的 type cast 一部分转化成了 context,而另一部分则转化成了 syntax error.
也就是说,在 C 中,任何两个数据都是可以 type cast 的,只是结果无法保证而已。
但是在 Perl 中,一些有意义的 type cast 被理解成了“在特定上下文中的表达式计算”,而另一部分没意义的,则变成了语法错误。

[ 本帖最后由 思平 于 2005-12-6 11:05 编辑 ]
作者: 思平    时间: 2005-12-06 10:43
$string = "abc";  # $string 是标量
$ref_array = \@array; # $ref_array 还是标量,因为引用就是一个标量,
$item = $array[0]; # $item 还是一个标量,因为数组的成员肯定是标量
$value = $hash{name}; # $value 也是标量,因为哈希表的 value 是标量。

$glob = *sym;     # $glob 突然一下子就变成了 GLOB?不再是 SCALAR 了?再或者 GLOB 就像 REF 一样,本质上也是一个标量?

再声明一点:我认为,我们应该从 Perl5 语法的层面上,找到它的解释,而不是从实现的层面上。
作者: 思平    时间: 2005-12-06 10:48
本回复已被合并。

[ 本帖最后由 思平 于 2005-12-6 11:06 编辑 ]
作者: apile    时间: 2005-12-06 11:42
啪啪...你不错喔...很有研究精神...

我不大管compile的内部运作,
也没有兴趣管那麽多....或许你该去问Larry本人...

就我的理解perl里面都是reference....也可以看成位址....
$a="aa" 实际是先存aa的位址...然後在某个地方有个hash会存一笔..

key=a value=address of "aa"; 还有type是SCALAR....

然後你可以透过$a取出来....@(ARRAY),%(HASH)同理....
但是如果address of "aa"存的内容跟@,%,$取值型态不同...
或许应该说找不到一个key是a且type是ARRAY或HASH的数据可以取用,
此时perl会给你一个null值....

address of aa所指向的memory,可以存的是另一个address of data....
例如:
aa->address of "aa"  type : SCALAR-->"aa"

aa->address of 'address of "aa"' type : REF--->address of "aa" type:SCALAR -->"aa"

至於type glob...是个特例..他可以ref到各种变量包括filehandle,@,$,%..他只是一个reference到不定address(或类似pointer的东西)..
至於address里面放什麽数据...没有限制..也就是上面例子中..他可以动态reference到第一层address的地方...

你爱用什麽方式就用什麽方式取出来...只是取错型态了(@,$,%,filehandle)
perl就给你一个空的值...你如果前面用$glob他就会先指向hash里面key是$glob的位址..看看里面的数值....

从C pointer的角度去看这个问题...会比较容易理解...

建议你可以看看advance perl programming里面有段在写type glob的问题...



好啦..不想争辩啦!!
没事可以多画画图..习惯C的用法(pointer to pointer)..
然後再想一下如果你是Larry..你要作没有int,float,double这些型态的宣告
你要怎麽作?

然後再回头来看这个问题会比较容易..

[ 本帖最后由 apile 于 2005-12-6 14:56 编辑 ]
作者: 兰花仙子    时间: 2005-12-06 20:14
  1. our %hash = ( a=>1 );
  2. my $glob = *hash;
复制代码



这2句偶理解就没觉得有困难,可能偶没想太多吧,:P
*hash只是个符号入口,它指示符号位于哪个包,以及符号的名称,具体是个ref还是个pointer,没必要去深究呀。
*hash{LABEL}只有在加上这个LABEL后才有意义,表明它是指向一个hash,还是一个scalar,还是一个array.
所以$glob = *hash并不存在上下文的错误哦,*hash这里并不代表hash,也不代表任何hash的引用,它只是个符号入口。
因为*hash可以代表一切,包括$hash,%hash,@hash,&hash,还有HANDLE等,但又可以说什么具体意义都没有,所以确实容易让人糊涂。

好在偶不想那么多,所以也不必为这个问题头痛了,嘿嘿。

一花一世界,一叶一菩提。
无我无相,四大皆空。

读读禅经,或许有助于理解,:P
作者: 思平    时间: 2005-12-06 21:56
原帖由 兰花仙子 于 2005-12-6 20:14 发表
无我无相,四大皆空。

读读禅经,或许有助于理解,

舍利子,是诸法空相,不生不灭,不垢不净不增不减。
仙子既然提到“禅”,禅宗由慧能始,又由慧能止,六祖曰:“菩提本无树,明镜亦非台”,何为“四大皆空”?
何谓“空”?
于真性情中,亦可见佛性,一味地追求空,其实却陷入了“色”,须知努力地修行并不能“增”,亦不能“净”,更不能“生”
古时有高僧由画入佛,我来个由 Perl 入佛,亦无不可……

[ 本帖最后由 思平 于 2005-12-6 22:01 编辑 ]
作者: fayland    时间: 2005-12-06 22:05
http://www.fayland.org/books/effective_perl.pdf
这是一本 Royalty-free licenses 的书,可以自由下载和阅读的。
里面的一些图表 PErl Graphical Structures 对 引用这类东西讲的很好。我推荐诸位有空读一下。
作者: 思平    时间: 2005-12-07 10:49
mlists.j@gmail.com 是哪位呢?
该不会是 ChinaUnix 上的朋友吧?

我今天从 maillist 上收到这份会话,看了一下时间是 12.5 号的,难道 mlists.j@gmail.com 是哪位 ChinaUnix 上的朋友?
仙子是你吗?

  1. A Strange Syntax
  2. 7 封邮件
  3. --------------------------------------------------------------------------------
  4. Jennifer Garner <mlists.j@gmail.com>  2005年12月5日 下午9:52  
  5. 收件人: beginners@perl.org
  6. Hi,lists,

  7. Seeing this code please:

  8. our %sym = (
  9.    name => 'flower',
  10.    age  => 23,
  11. );

  12. print ${*{$::{sym}}{HASH}}{name};

  13. The result of printing is : flower.

  14. How to analyse the last sentence of that code?Thanks.




  15. --------------------------------------------------------------------------------
  16. Adriano Ferreira <a.r.ferreira@gmail.com>  2005年12月5日 下午10:53  
  17. 收件人: Jennifer Garner <mlists.j@gmail.com>, beginners@perl.org
  18. On 12/5/05, Jennifer Garner <mlists.j@gmail.com> wrote:
  19. > print ${*{$::{sym}}{HASH}}{name};

  20. > How to analyse the last sentence of that code?Thanks.

  21. From "perldoc perlref"

  22.       7.  A reference can be created by using a special syntax, lovingly
  23.           known as the *foo{THING} syntax.  *foo{THING} returns a reference
  24.           to the THING slot in *foo (which is the symbol table entry which
  25.           holds everything known as foo).

  26.               $scalarref = *foo{SCALAR};
  27.               $arrayref  = *ARGV{ARRAY};
  28.               $hashref   = *ENV{HASH};
  29.               $coderef   = *handler{CODE};
  30.               $ioref     = *STDIN{IO};
  31.               $globref   = *foo{GLOB};

  32. So $::{sym} returns the glob symbol "sym" on the main package ($main::
  33. or $::), takes a reference to its HASH part, and returns what it got
  34. in the key "name". Piece of cake, ain't it?

  35. Regards,
  36. Adriano.

  37. --
  38. To unsubscribe, e-mail: beginners-unsubscribe@perl.org
  39. For additional commands, e-mail: beginners-help@perl.org
  40. <http://learn.perl.org/> <http://learn.perl.org/first-response>





  41. --------------------------------------------------------------------------------
  42. Wiggins d'Anconia <wiggins@danconia.org>  2005年12月6日 上午2:33  
  43. 收件人: Adriano Ferreira <a.r.ferreira@gmail.com>
  44. 抄送: Jennifer Garner <mlists.j@gmail.com>, beginners@perl.org
  45. Adriano Ferreira wrote:
  46. > On 12/5/05, Jennifer Garner <mlists.j@gmail.com> wrote:
  47. >
  48. >>print ${*{$::{sym}}{HASH}}{name};
  49. >
  50. >
  51. >>How to analyse the last sentence of that code?Thanks.
  52. >
  53. >
  54. >>From "perldoc perlref"
  55. >
  56. >        7.  A reference can be created by using a special syntax, lovingly
  57. >            known as the *foo{THING} syntax.  *foo{THING} returns a reference
  58. >            to the THING slot in *foo (which is the symbol table entry which
  59. >            holds everything known as foo).
  60. >
  61. >                $scalarref = *foo{SCALAR};
  62. >                $arrayref  = *ARGV{ARRAY};
  63. >                $hashref   = *ENV{HASH};
  64. >                $coderef   = *handler{CODE};
  65. >                $ioref     = *STDIN{IO};
  66. >                $globref   = *foo{GLOB};
  67. >
  68. > So $::{sym} returns the glob symbol "sym" on the main package ($main::
  69. > or $::), takes a reference to its HASH part, and returns what it got
  70. > in the key "name". Piece of cake, ain't it?
  71. >
  72. > Regards,
  73. > Adriano.
  74. >

  75. Now that you understand it, replace it with $sym->{name} so the next
  76. person doesn't have to ask. Unless you are using a really old Perl.

  77. http://danconia.org

  78. [引用文字已隐藏]


  79. --------------------------------------------------------------------------------
  80. Flemming Greve Skovengaard <dsl58893@vip.cybercity.dk>  2005年12月6日 上午3:05  
  81. 收件人: "beginners@perl.org" <beginners@perl.org>
  82. 抄送: Wiggins d'Anconia <wiggins@danconia.org>
  83. Wiggins d'Anconia wrote:
  84. >
  85. > Now that you understand it, replace it with $sym->{name} so the next
  86. > person doesn't have to ask. Unless you are using a really old Perl.
  87. >

  88. Actually that should be *sym->{name} instead of $sym->{name} ( or %sym->{name}
  89. but that's deprecated ).
  90. Else you get "Variable "$sym" is not imported at ..." when using 'use strict;'
  91. ( as you should ).

  92. --
  93. Flemming Greve Skovengaard                    The prophecy of the holy Norns
  94. a.k.a Greven, TuxPower                        The world is doomed to die
  95. <dsl58893@vip.cybercity.dk>                   Fire in the sky
  96. 4112.38 BogoMIPS                              The end is coming soon

  97. [引用文字已隐藏]


  98. --------------------------------------------------------------------------------
  99. Jennifer Garner <mlists.j@gmail.com>  2005年12月6日 上午9:10  
  100. 收件人: Flemming Greve Skovengaard <dsl58893@vip.cybercity.dk>
  101. 抄送: "beginners@perl.org" <beginners@perl.org>, Wiggins d'Anconia <wiggins@danconia.org>
  102. ${*{$::{sym}}{HASH}}{name};

  103. As we know, $::{sym} == *main::sym, it's a typeglob.
  104. but what is **main::sym? and the same,what is *{$glob}?thanks.

  105. [引用文字已隐藏]


  106. --------------------------------------------------------------------------------
  107. Adriano Ferreira <a.r.ferreira@gmail.com>  2005年12月7日 上午12:26  
  108. 收件人: Jennifer Garner <mlists.j@gmail.com>, beginners@perl.org
  109. On 12/5/05, Jennifer Garner <mlists.j@gmail.com> wrote:
  110. > As we know, $::{sym} == *main::sym, it's a typeglob.
  111. > but what is **main::sym? and the same,what is *{$glob}?thanks.

  112. **main::sym is a syntax error, but *{*main::sym}==*main::sym.

  113. But don't be fooled by the equality $::{sym} == *main::sym. It just
  114. means they numerically compare the same. Taking references you get
  115. that $::{sym} returns a scalar and *main::sym a glob.

  116. $ perl -e 'print \($::sym, *main::sym)'
  117. SCALAR(0x1002f094)GLOB(0x10010fa8)

  118. So *{$glob} is the way to tell Perl to go from the scalar to the glob,
  119. when we'll be able to access its HASH part.

  120. That's why

  121. $ perl -e 'our %sym = (name => "flower"); print ${*{$::{sym}}{HASH}}{name};"

  122. prints "flower", but

  123. $ perl -e 'our %sym = (name => "flower"); print ${$::{sym}{HASH}}{name};"

  124. prints nothing ($::{sym}{HASH} returns undef). As Wiggins wisely said,
  125. $sym->{name} is more sane.

  126. --

  127. [引用文字已隐藏]


  128. --------------------------------------------------------------------------------
  129. Jennifer Garner <mlists.j@gmail.com>  2005年12月7日 上午9:16  
  130. 收件人: "beginners@perl.org" <beginners@perl.org>
  131. Thanks for Adriano Ferreira.Your explaination is good for me.I have known
  132. that.

  133. [引用文字已隐藏]
复制代码

[ 本帖最后由 思平 于 2005-12-7 11:07 编辑 ]
作者: 思平    时间: 2005-12-07 11:24
经过多方考证,
我现在已经基本上已经有了结论了。
等下有空了我再参照一下 Perl 的源码,争取对 GLOB 做个结论。
作者: 兰花仙子    时间: 2005-12-07 12:08
**main::sym is a syntax error, but *{*main::sym}==*main::sym.

But don't be fooled by the equality $::{sym} == *main::sym. It just
means they numerically compare the same. Taking references you get
that $::{sym} returns a scalar and *main::sym a glob.

$ perl -e 'print \($::sym, *main::sym)'
SCALAR(0x1002f094)GLOB(0x10010fa8)

So *{$glob} is the way to tell Perl to go from the scalar to the glob,
when we'll be able to access its HASH part.

That's why

$ perl -e 'our %sym = (name => "flower"); print ${*{$::{sym}}{HASH}}{name};"

prints "flower", but

$ perl -e 'our %sym = (name => "flower"); print ${$::{sym}{HASH}}{name};"

prints nothing ($::{sym}{HASH} returns undef). As Wiggins wisely said,
$sym->{name} is more sane.


上述这段话足够解答你的疑惑了,嘿嘿。
作者: 思平    时间: 2005-12-07 12:59
呵呵!
其实我什么疑惑都没有……
唉。
不说也罢。
作者: 兰花仙子    时间: 2005-12-07 13:18
$glob = *sym;     # $glob 突然一下子就变成了 GLOB?不再是 SCALAR 了?再或者 GLOB 就像 REF 一样,本质上也是一个标量?

$glob还是个SCALAR的,*sym是个GLOB,为什么它们会相等?
也用不了想那么多的,Perl内部就定义了它们可以这样赋值的。
our %sym;
这样申明后,查看%::符号表,会找到:
$::{sym} == *main::sym
上述也明显的左边是SCALAR,右边是GLOB,它们就是这样赋值的。
GLOB具体是个什么东东?就等着各位去揭晓了。偶认为它只是一个符号,就是内存中的某个点,它存储了指向具体数据类型的指针。
"一粒微尘看世界",当年佛祖捻花一笑,感化世间万丈红尘;Larry Wall键盘一敲,蹦出了GLOB这个莫须有而又包囊无限的东东。
作者: 思平    时间: 2005-12-07 13:42
如果从 Perl 解释器的代码这个层面上来看,GLOB 的确是一种 Scalar,这个只要看一下 sv.h 就知道了(注),不过这不是我想要的。
事实上,我非常不愿意做的,就是从语言的实现上去解释语言。
截止到目前为止,我还是没有放弃。
大家说的我都明白,我只是想,怎么解释可以让它更优美、更抽象……


注:
sv.h 中有如下代码:
  1. typedef enum {
  2.     SVt_NULL,   /* 0 */
  3.     SVt_IV,     /* 1 */
  4.     SVt_NV,     /* 2 */
  5.     SVt_RV,     /* 3 */
  6.     SVt_PV,     /* 4 */
  7.     SVt_PVIV,   /* 5 */
  8.     SVt_PVNV,   /* 6 */
  9.     SVt_PVMG,   /* 7 */
  10.     SVt_PVBM,   /* 8 */
  11.     SVt_PVLV,   /* 9 */
  12.     SVt_PVAV,   /* 10 */
  13.     SVt_PVHV,   /* 11 */
  14.     SVt_PVCV,   /* 12 */
  15.     SVt_PVGV,   /* 13 */
  16.     SVt_PVFM,   /* 14 */
  17.     SVt_PVIO    /* 15 */
  18. } svtype;
复制代码

[ 本帖最后由 思平 于 2005-12-7 14:16 编辑 ]
作者: wangchick    时间: 2005-12-08 13:53
楼上各位都说的是中文,我怎么就看不懂泥....




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