Chinaunix

标题: 数组套散列和散列套散列报错,请指教 [打印本页]

作者: 有行动才会有收获    时间: 2010-09-27 15:43
标题: 数组套散列和散列套散列报错,请指教
@b = (["1" => "a", "2" => "b"], ["a" => "A", "b" => "B"]);
print $b[0]{"2"},"\n";              <-- 报错

%d = ("m" => ["1" => 10, "2" => 20], "n" => ["1" => 100, "2" => 200]);
print $d{"m"}{"2"},"\n";                <-- 报错

为什么是错误的?要如何改?谢谢!
作者: 珞水的大叔    时间: 2010-09-27 15:49
本帖最后由 珞水的大叔 于 2010-09-27 15:50 编辑

[]是数组的引用
例如:["1" => "a", "2" => "b"]等价于[("1","a","2","b")]
{}才是哈希的引用
改为:
  1. @b = ({"1" => "a", "2" => "b"}, {"a" => "A", "b" => "B"});
  2. %d = ("m" => {"1" => 10, "2" => 20}, "n" => {"1" => 100, "2" => 200});
复制代码

作者: 有行动才会有收获    时间: 2010-09-27 15:52
[]是数组的引用
例如:["1" => "a", "2" => "b"]等价于[("1","a","2","b")]
{}才是哈希的引用
改为:
珞水的大叔 发表于 2010-09-27 15:49


好像不对啊,还是报错
作者: wfnh    时间: 2010-09-27 15:56
=>···起神奇逗号作用···
作者: 有行动才会有收获    时间: 2010-09-27 16:01
=>···起神奇逗号作用···
wfnh 发表于 2010-09-27 15:56


就是说这种写法不正确喽

那应该怎么写呢?
作者: 珞水的大叔    时间: 2010-09-27 16:07
回复 3# 有行动才会有收获


    我在2楼里面写了啊
  仔细看看

  改为:
  1. @b = ({"1" => "a", "2" => "b"}, {"a" => "A", "b" => "B"});
  2. %d = ("m" => {"1" => 10, "2" => 20}, "n" => {"1" => 100, "2" => 200});
复制代码

作者: 珞水的大叔    时间: 2010-09-27 16:09
本帖最后由 珞水的大叔 于 2010-09-27 16:10 编辑
好像不对啊,还是报错
有行动才会有收获 发表于 2010-09-27 15:52



    我写的这个
    例如:["1" => "a", "2" => "b"]等价于[("1","a","2","b")]
    就是你原来错误写法的等价状况,它当然是错的啊……
作者: wfnh    时间: 2010-09-27 16:09
本帖最后由 wfnh 于 2010-09-27 16:12 编辑

回复 5# 有行动才会有收获


    如果··你要你的print语句不变的话···可以这样定义数组:
@b = ({'1' => "a"}, {"2" => "b"}, {"a" => "A"},{"b" => "B"});

or

@b = ({'1' => "a", "2" => "b"}, {"a" => "A","b" => "B"});
作者: 有行动才会有收获    时间: 2010-09-27 16:11
回复  有行动才会有收获


    我在2楼里面写了啊
  仔细看看

  改为:
珞水的大叔 发表于 2010-09-27 16:07


我直接复制你的代码,执行正确

看来是我之前改错了

谢谢!
作者: shaneqi    时间: 2010-09-27 16:12
  1. my @b = ({"1" => "a", "2" => "b"}, {"a" => "A", "b" => "B"});
  2. my %d = ("m" => {"1" => 10, "2" => 20}, "n" => {"1" => 100, "2" => 200});

  3. print $b[0]{"1"},"\n";
  4. print $d{"m"}{"1"},"\n";
复制代码

作者: 有行动才会有收获    时间: 2010-09-27 16:18
本帖最后由 有行动才会有收获 于 2010-09-27 16:19 编辑
我写的这个
    例如:["1" => "a", "2" => "b"]等价于[("1","a","2","b"]
    就是你原来错误 ...
珞水的大叔 发表于 2010-09-27 16:09


是因为中括号的原因吗?

中括号会把=>变成逗号?
作者: toniz    时间: 2010-09-27 16:37
perl的变量和它所处的环境有关联。
这个是属于在列表环境使用HASH变量的问题。
在这种情况下,它会把哈希的建值对转换成列表。

举个简单点的关系,如在标量环境使用数组,$a=@aa,那么数组返回的是元素个数。同样的道理。
作者: 珞水的大叔    时间: 2010-09-27 16:45
回复 11# 有行动才会有收获


    差不多就是这个意思
   准确来说 => 相当于 "",
    例如:
    a => 'b'  相当于 "a",'b'
作者: 有行动才会有收获    时间: 2010-09-27 16:53
噢~~,谢谢各位!
作者: cocowool    时间: 2010-09-27 16:57
回复 12# toniz

受教了,最近也受困与hash的使用
hash能否通过简单的赋值进行传递,还是只能传递hash的引用
作者: toniz    时间: 2010-09-27 17:04
看了你的帖子了,你用的时候,再将引用转换回HASH就行了。  %{$value}
作者: cocowool    时间: 2010-09-27 17:27
回复 16# toniz

感谢,搞定了,我刚才没加 {}
perl的语法真是太灵活了
作者: cocowool    时间: 2010-09-28 09:53
回复 6# 珞水的大叔

散列套数组呢,我试了

%d = ( "a" => ('1','2'), "b" => ('3','4') );
  
这里面 => 貌似起了神奇的逗号的作用
作者: wxlfh    时间: 2010-09-28 10:18
回复  珞水的大叔

散列套数组呢,我试了

%d = ( "a" => ('1','2'), "b" => ('3','4') );
  
这里面 ...
cocowool 发表于 2010-09-28 09:53
  1. %d = ('a' => [1,2], 'b' => [3,4]);
复制代码
这样才正确。
作者: 珞水的大叔    时间: 2010-09-28 10:38
本帖最后由 珞水的大叔 于 2010-09-28 10:43 编辑

回复 18# cocowool


    同上
   要注意哈希的定义啊, => 两端必须是标量才能起到定义hash的key与value的作用
   %d = ( "a" => ('1','2'), "b" => ('3','4') )
    等于
   %d = ( "a",'1','2', "b" ,'3','4' )
    等于
   %d = ( "a" => '1' , '2' => "b" , '3' => '4' )
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use 5.010;

  5. my %d = ( "a" => ('1','2'), "b" => ('3','4') );
  6. say "$_ => $d{$_}" for keys %d
复制代码
结果如下:
a => 1
3 => 4
2 => b




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2