从Array中的Hash访问值

时间:2014-01-08 08:55:27

标签: arrays perl hash printing

我正在尝试访问数组中哈希的值。示例:

@worte = {}; 

for my $i (0 .. 4){
    my (%wortObj) = (Index => $i, Text => "Text$i"); 
    print "$wortObj{Index} $wortObj{Text}\n"; 
    push @worte, %wortObj; 
}

foreach $wortObject (@worte){
    print "$wortObject{Index} $wortObject{Text}\n"; 
}

第一个print语句可以工作并创建正确的输出。我想第二个print语句给出相同的输出。但我只获得了许多空行。我做错了什么?

2 个答案:

答案 0 :(得分:1)

Perl有一个名为 context 的功能,它要么绝对精彩,要么令人难以置信。现在发生的是, list context 中使用的哈希变量评估为密钥和值的平面列表,例如, %hash = (Index => 1, Text => "Text1")可能会生成列表

'Text', 'Text1', 'Index', 1

然后将push中的每一项都添加到数组中。还有标量上下文告诉我们正在使用散列中有多少“桶”。但是我们怎样才能将哈希值推到数组上呢?

我们没有。由于某些原因,集合不能将另一个集合作为值。相反,我们必须使用引用,我们可以使用\运算符获取(引用类似于指针,但更安全)。我们可以将该哈希引用推送到数组:

push @worte, \%wortObj;

现在当我们循环遍历该数组中的项时,它们不是哈希 - 它们是对哈希的引用。因此,在访问“hashref”中的字段之前,我们必须首先取消引用它们。一种方法是使用->运算符,我们得到:

for my $wortObj (@worte) {
   print "$wortObj->{Index} $wortObj->{Text}\n";
}

有关参考文献的详细信息,请从perlreftut开始,然后阅读perlrefperldscperlootut

答案 1 :(得分:0)

因为你的代码无效,所以会有一些错误

@worte = {}; 

上面的行定义了一个数组写入并将其作为第一个元素作为参考哈希。我们不想要的。我们可以简单地声明一个数组@wrote

for my $i (0 .. 4){
    my (%wortObj) = (Index => $i, Text => "Text$i"); 
    print "$wortObj{Index} $wortObj{Text}\n"; 
    push @worte, %wortObj; 

上面一行尝试在列表上下文中存储%wortobj哈希,这是不可能的,我们需要将它存储在标量引用中。我们可以将代码编辑为push @worte,\%wortObj;

}

foreach $wortObject (@worte){
    print "$wortObject{Index} $wortObject{Text}\n"; 

以上一行尝试从hashrefence打印,但第一个 - >运营商从不暗示。我们可以将其编辑为打印“$ wortObject-> {Index} $ wortObject-> {Text} \ n”;

}