LinuxSir.cn,穿越时空的Linuxsir!

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

求叫 引用问题

[复制链接]
发表于 2004-4-26 22:22:43 | 显示全部楼层 |阅读模式
#!/usr/bin/perl
for(my $i=1;$i<10;$i++){
for(my $j=1;4j<10;$j++){
$array[$i-1][$j-1]=$i*$j;
}
}
for(my $k=0;$k<9;$k++){
print @{$array->[$k]};
}
不可用

print @{$array[$k]};
可以

难道
$array->[$K]不等价于$array[$k];
发表于 2004-4-26 22:52:28 | 显示全部楼层

回复: 求叫 引用问题

最初由 wss12cn 发表
#!/usr/bin/perl
for(my $i=1;$i<10;$i++){
for(my $j=1;4j<10;$j++){
$array[$i-1][$j-1]=$i*$j;
}
}
for(my $k=0;$k<9;$k++){
print @{$array->[$k]};
}
不可用

print @{$array[$k]};
可以

难道
$array->[$K]不等价于$array[$k];

这个。。。。$array->[$k] 这里的$array不知道是哪个元素,又指向一个序列,不能解释。。。而且前面加有@{},错误的语法。。。

这里有例子:
http://www.linuxsir.cn/forum.php?mod=viewthread&tid=77453
这里也是:
[code]
#!/usr/bin/perl -w
@arrayA=(1..5);
@arrayB=(6..10);
unshift (@arrayA,@arrayB);
$count=@arrayA;
print "$count\n";
$a=0;
while($a<$count) {
    print "$arrayA[$a]  " ;
    $a += 1 ;
}
foreach(@arrayA){
      print;
}
print "\n";
[/ocde]
发表于 2004-4-26 22:55:43 | 显示全部楼层
你的程序经过修改,是这样,但输出的结果我不能解释??

  1. #!/usr/bin/perl
  2. for(my $i=1;$i<10;$i++){
  3.    for(my $j=1;$j<10;$j++){
  4.         $array[$i-1][$j-1]=$i*$j;
  5.    }
  6. }
  7. for(my $k=0;$k<9;$k++){
  8. print "$array[$k]";
  9. }
  10. print "\n";
复制代码

ARRAY(0x804c9b8)ARRAY(0x8066354)ARRAY(0x80663d8)ARRAY(0x806645c)ARRAY(0x80664e0)ARRAY(0x8066564)ARRAY(0x80665e8)ARRAY(0x806666c)ARRAY(0x8063ec4)


请教大家??:help :help
发表于 2004-4-26 22:58:35 | 显示全部楼层
难道$array->[$K]不等价于$array[$k];

是的。
但$array[$J]->[$K]等价于$array[$J][$K],perl的规矩是在两个大括号或中括号之间的->可以省略,其它的不行。
发表于 2004-4-26 23:07:37 | 显示全部楼层
你的程序经过修改,是这样,但输出的结果我不能解释??



print @{$array[$k]};是对的,应该这样写。
而print "$array[$k]";打印其实是数组所在的地址。
在man perldsc里有比较详细的分析。

……

Now, because the top level contains only references, if you try to print out your array in with a simple print() function, you'll get something that doesn't look very nice, like this:

[php]
    @AoA = ( [2, 3], [4, 5, 7], [0] );
    print $AoA[1][2];
  7
    print @AoA;
  ARRAY(0x83c38)ARRAY(0x8b194)ARRAY(0x8b1d0)
[/php]
That's because Perl doesn't (ever) implicitly dereference your variables. If you want to get at the thing a reference is referring to, then you have to do this yourself using either prefix typing indicators, like ${$blah}, @{$blah}, @{$blah[$i]}, or else postfix pointer arrows, like $a->[3], $h->{fred}, or even $ob->method()->[3].
 楼主| 发表于 2004-4-28 20:04:42 | 显示全部楼层
print @{$array->[$k]};  打印结果为空  但格式和print @{$array[$k]};一样
print @{$array[$k]};结果为 1 2 3 4 5 6 7 8 9
                                            ....
                                            .
                                            9....................81  
此例出现在一本perl教材上 (没有给结果) 以上是我机器上的执行结果
发表于 2004-4-28 20:59:52 | 显示全部楼层
呵呵,@{}是一个间接引用了,@表示她内部的数据组合以后的数据类型,$array->[$k]是不可以这样写的,应该是$array[$k],因为你的第一个并不是引用,注意两种数组的区别
@array = (1,2,3,4);
@array = [1,2,3,4];
前面的是数组,而后面的却是引用
发表于 2004-4-28 20:59:56 | 显示全部楼层
呵呵,@{}是一个间接引用了,@表示她内部的数据组合以后的数据类型,Perl只关心结果,她不管过程的
$array->[$k]是不可以这样写的,应该是$array[$k],因为你的第一个并不是引用,而是正常的一个元素了

注意两种数组的区别
@array = (1,2,3,4);
@array = [1,2,3,4];
前面的是数组,而后面的却是引用
如果要取得第一个元素
第一个要用array[0]
第二个要用array[0]->[0]
这个就是区别了

只有在引用的时候才可以使用->她等价与$$这样的间接引用了
如果本来就是数组的东西,你用了->来间接引用的话,肯定会弄错结果的撒
 楼主| 发表于 2004-4-29 08:46:21 | 显示全部楼层
我们定义一个二维数组
可以@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 08:51:55 | 显示全部楼层
我用程序试了一下
#!/usr/bin/perl
for(my $i=1;$i<10;$i++){
for(my $j=1;4j<10;$j++){
$array->[$i-1][$j-1]=$i*$j;
}
}
for(my $k=0;$k<9;$k++){
print @{$array->[$k]};
}
通过
#!/usr/bin/perl
for(my $i=1;$i<10;$i++){
for(my $j=1;4j<10;$j++){
$array[$i-1][$j-1]=$i*$j;
}
}
for(my $k=0;$k<9;$k++){
print @{$array[$k]};
}
也通过
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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