我正在尝试访问数组中哈希的值。示例:
@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语句给出相同的输出。但我只获得了许多空行。我做错了什么?
答案 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
开始,然后阅读perlref
,perldsc
和perlootut
。
答案 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”;
}