最初由 BBDD 发表
tojeff兄的第二个例子举得不太好,应该写成
@array = ([1, 2, 3, 4]);
或:
$array = [1, 2, 3, 4];
才规范。
在你的这两个程序里,第一个array是标量$array,而第二个则是数组@array。
第一个array其实是这样的:
$array = [ [1, 2, 3, 4, 5, 6, 7, 8, 9],
[2, 4, 6, 8, 10, 12, 14, 16, 18],
[3, 6, 9, 12, 15, 18, 21, 24, 27],
[4, 8, 12, 16, 20, 24, 28, 32, 36],
[5, 10, 15, 20, 25, 30, 35, 40, 45],
[6, 12, 18, 24, 30, 36, 42, 48, 54],
[7, 14, 21, 28, 35, 42, 49, 56, 63],
[8, 16, 24, 32, 40, 48, 56, 64, 72],
[9, 18, 27, 36, 45, 54, 63, 72, 81] ];
其中的@{$array->[2]} = [3, 6, 9, 12, 15, 18, 21, 24, 27],
而$array->[2]->[3] = $array->[2][3] = 12。
第二个array是这样的:
@array = ( [1, 2, 3, 4, 5, 6, 7, 8, 9],
[2, 4, 6, 8, 10, 12, 14, 16, 18],
[3, 6, 9, 12, 15, 18, 21, 24, 27],
[4, 8, 12, 16, 20, 24, 28, 32, 36],
[5, 10, 15, 20, 25, 30, 35, 40, 45],
[6, 12, 18, 24, 30, 36, 42, 48, 54],
[7, 14, 21, 28, 35, 42, 49, 56, 63],
[8, 16, 24, 32, 40, 48, 56, 64, 72],
[9, 18, 27, 36, 45, 54, 63, 72, 81] );
其中的@{$array[2]} = [3, 6, 9, 12, 15, 18, 21, 24, 27],
而$array[2]->[3] = $array[2][3] = 12。
不知道这样讲你明白了没有?
你没有明白我举这个例子的真正意义,我知道那样的等价,如果使用@array = ([1, 2, 3, 4]);那就没有把道理说清楚,一句话,第一层不可以是直接是一个引用,因为Perl是只关心结果的,所有她必须和前面的类型匹配了,所有必须一定是一个数组(匹配前面@),自己体会吧:)
应该要区分下面的几个操作符:
几种引用和间接引用
1.\ -------------硬引用(指想内存)
2.[@array] -------------复制引用(数组)
3.{%hash} -------------复制引用(散列)
4.-> -------------间接引用(求值)等价$$
5.$$ -------------间接引用(求值)等价->
6.@{},%{} -------------间接引用(求值),前面的符号表示结果类型
1,2,3是一类,使用相同的思想,不过要分出谁要复制副本
4,5是一类,使用相同的思想,他们都是用与获得引用的值,但是不能够用于非引用的情况下 |