LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 945|回复: 2

我对->操作符的一个好的理解方法,希望对大家有帮助

[复制链接]
发表于 2004-5-1 18:26:57 | 显示全部楼层 |阅读模式
最近发现很多朋友在理解->这个操作符上都遇到了困难,所以提供一个我自己的理解方法,希望对大家有帮助:

$a = \$c;

现在引用指向一个标量,所以->操作符不能使用,要使用$$a来解引用。
而在指向数组和散列表时,->就派上用场了:

@a = ( '1st', '2nd', '3rd', '4th' );
$c = \$a[3];
$b = \@a;

你看,现在$b和$c分别指向了数组和一个数组中的值,现在,以下表达式就可以使用了
if ( $$c eq $b->[3] ) { print "Sure you'll be here!\n"; }

现在假设我将$c指向@a,如下:

$c = \@a;

其实对->操作符的理解,关键就在于下面这个表达式了:
if ( $$c[2] eq $b->[2] ) { print "Welcome back!\n"; }

我把这个表达式再写清楚点:
if ( ${$c}[2] eq $b->[2] ) { print "You'ar back again!\n"; }

你发现了吗?Perl认为 ${$c} 与 $b-> 是等价的,也就是说,你可以把->理解为一个后缀操作符,一个解引用操作符。
所以在阅读$b->[2]->[3] += 2;这样的代码的时候,我们应该这样来阅读:

首先,$b->将解引用,是一个数组,然后$b->[2]就是这个数组中第三个标量的值,然后$b->[2]->这一部分将我们刚刚获得的引用再次解引用,又是一个数组,那么很明显,$b->[2]->[3]就是取得这个数组的第四个标量了。

其他的表达式都可以类似分析,一开始时可能这样分析很慢,但是我自己发现很快就可以完全掌握这样的分析方法,速度会越来越快,而且不容易出错。

希望我的方法对大家有用,如果有什么别的方法,也请大家能够发表出来!
发表于 2004-5-1 20:58:41 | 显示全部楼层
楼主的思维很独特哦。。。。
我也有我的想法,把-> 看成想C语言的指针,这样也很容易理解。。。

thanks!!
发表于 2004-5-2 07:54:04 | 显示全部楼层
:thank


  1. [linuxer@mydesktop bmp]$ perl -e '@array = ([[1, 2, 3], [4 ,5 ,6]], [[7, 8, 9],
  2. [a, b, c]], [[d, e, f], [g, h, i]]);\
  3. printf("1、\$array[2][1][0] = $array[2][1][0]\n");\
  4. printf("   \$array[2]->[1]->[0] = $array[2]->[1]->[0]\n");\
  5. printf("2、\@array[2]->[1]->[0] = @array[2]->[1]->[0]\n");\
  6. printf("   \@array[2][1][0] 好象是非法的\n");\
  7. printf("3、三维数组里头的第三个数组里的第二个数组:@{@array[2]->[1]}\n");'
  8. 1、$array[2][1][0] = g
  9.    $array[2]->[1]->[0] = g
  10. 2、@array[2]->[1]->[0] = g
  11.    @array[2][1][0] 好象是非法的
  12. 3、三维数组里头的第三个数组里的第二个数组:g h i
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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