LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: wss12cn

求叫 引用问题

[复制链接]
发表于 2004-4-29 09:23:29 | 显示全部楼层
注意两种数组的区别
@array = (1,2,3,4);
@array = [1,2,3,4];
前面的是数组,而后面的却是引用
如果要取得第一个元素
第一个要用array[0]
第二个要用array[0]->[0]


       
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。

不知道这样讲你明白了没有?
发表于 2004-4-29 09:36:02 | 显示全部楼层
我们定义一个二维数组
可以@array=([a,b,c,d],[e,f,g,h]);
也可以$array=[[a,b,c,d],[e,f,g,h]];
是不是$array[$i][$j]创建的是第一个
而$array->[$i][$j]创建的第二个


抱歉,没看到你的这个帖子,我上面的帖子是多余的,你已经清楚了。
发表于 2004-4-29 10:22:56 | 显示全部楼层
最初由 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是一类,使用相同的思想,他们都是用与获得引用的值,但是不能够用于非引用的情况下
发表于 2004-4-29 10:34:28 | 显示全部楼层
最初由 wss12cn 发表
我们定义一个二维数组
可以@array=([a,b,c,d],[e,f,g,h]);
也可以$array=[[a,b,c,d],[e,f,g,h]];
是不是$array[$i][$j]创建的是第一个
而$array->[$i][$j]创建的第二个


$array=[[a,b,c,d],[e,f,g,h]];
和@array=[[a,b,c,d],[e,f,g,h]];
他们的深度不一样了,后面的比前面的多一个深度
$array=[[a,b,c,d],[e,f,g,h]];是一个标量,他是指向 一个嵌套了两个含有数组引用元素的数组的引用;
@array=[[a,b,c,d],[e,f,g,h]];是一个数组,他是第一个元素是 上面的$array

如果你要定位 'a' 的话,第一个用$array->[0]->[0],第二个要用$array[0]->[0]->[0],并且不能够使用$array->[0]->[0]->[0]

也就是要注意结果的类型
发表于 2004-4-29 10:40:28 | 显示全部楼层
这个发错了
发表于 2004-4-29 11:01:02 | 显示全部楼层
[1, 2, 3, 4]是指向数组的引用。它是标量,而不是数组。

你如果觉得把
@array = (1);
写成:
@array = 1;
是对的,那随便你。但我是不会把这种写法推荐给别人的。

同样,把
@array = ([1,2,3,4]);
写成
@array = [1, 2, 3, 4];
也可以,但用它来说明“什么是引用”就是在制造混乱了。
发表于 2004-4-29 11:31:58 | 显示全部楼层
#!/usr/bin/perl -w
@array = 1;
print $array[0];
报错吗?Perl本来就有自动转换的功能
上面的形式很相似,所以用来区分概念最恰到好处了!

我不喜欢和人争论,随便你怎么想,呵呵
人本来就是这个样子的,在不同的阶段就有不同的想法

另外我郑重声明:我大没有制造混乱之心,如果你觉得我在制造混乱的话,你大可不要理会我,你可以拒绝我的思想,但是你不可以试图控制我的思想,本人做事,都是从别人的利益出发,也喜欢给他人带来方便

到此为止,下面我不再回复
发表于 2004-4-29 11:39:05 | 显示全部楼层
个人的编成风格不同,他人不要介意哟!!!
 楼主| 发表于 2004-4-29 13:40:38 | 显示全部楼层
大家都是为了弄明白问题   都没有什么恶意   

谢谢大家
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表