- 论坛徽章:
- 0
|
to apile 前辈:
1, apile 前辈写道
你的语法错误....
{} 回传的是一个ref to hash的引用....你把他负值给hash...是会有问题的....
非常抱歉,手误,已改正。
不过我的疑问并不是“这句话是什么意思”,因为它的意思我是知道的。
我只是想知道,这个语法,从 Perl 的角度,该如何去自圆其说。
注:Perl 里面最起码的一个规则就是,$ 表示一个量,@ 表示多个量。
$glob 经过赋值之后,到底是几个量?(答曰:一个 GLOB)
GLOB 到底是 HASH 还是 REF?
2, apile 前辈的意思是说:
$glob其实就是等於一个ref to typeglob 也可以把他看成pointer...
这个是错误的,
请看下面:
- print ref $glob, "\n";
- print ref \$glob, "\n";
复制代码
前者打印空格,而后者打印 GLOB,
由此可见,$glob 是一个 GLOB 而不是 REF of GLOB
3, 另外 apile 前辈说:
透过${$glob}可以将$glob指向hash的实际位址
也是错误的。
${$glob} 取到的并非是指向 hash 的实际地址。
而是 $glob 这个 GLOB 中,其中标量分量的值。
请看下面:
- our $hash = 'not_a_hash';
- our %hash = ( a=>1 );
- my $glob = *hash;
- print ${$glob};
- __END__
- output is 'not_a_hash'
复制代码
4, apile 前辈还说:
从这一点来看,$glob 更像一个 ref of hash,而不是你前面所说的 ref of typeglob
请看下面:
- our %hash = ( a => 1 );
- my $glob = \%hash;
- print ${$glob}{a};
- __END__
- 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 编辑 ] |
|