【问题标题】:Access values from Hash inside Array从 Array 内的 Hash 访问值
【发布时间】:2014-01-26 06:33:18
【问题描述】:

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

@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"; 
}

第一个打印语句起作用并创建正确的输出。我希望第二个打印语句给出相同的输出。但我只得到一些空行。我做错了什么?

【问题讨论】:

    标签: arrays perl hash printing


    【解决方案1】:

    Perl 有一个称为 context 的功能,它要么非常出色,要么令人难以置信。现在碰巧在 list context 中使用的散列变量评估为键和值的平面列表,例如%hash = (Index => 1, Text => "Text1") 可能会生成列表

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

    然后这些项目中的每一个都被pushed 到数组中。还有一个标量上下文,它告诉我们哈希中有多少“桶”正在被使用。但是我们如何才能将哈希推送到数组上呢?

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

    push @worte, \%wortObj;
    

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

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

    有关参考的更多信息,请以perlreftut 开头,然后可能阅读perlrefperldscperlootut

    【讨论】:

    • 谢谢。我怀疑我错过了一些基本的东西。我什至在尝试使用大括号——假设这足以告诉 Perl 使用散列引用。好吧,再次感谢您。
    【解决方案2】:

    好吧,有几个错误导致您的代码无法正常工作

    @worte = {}; 
    

    上面的行定义了一个写入的数组,并将其作为第一个元素作为对哈希的引用。这是我们不想要的。我们可以简单地声明一个数组@write

    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 打印,但第一个 -> 运算符从未被暗示。我们可以将其编辑为 print "$wortObject->{Index} $wortObject->{Text}\n";

    }

    【讨论】:

    • 又是同样的答案:)
    • 我宁愿有太多而不是太少的答案。谢谢你。 (我对你 +1 的声望太少,对此感到抱歉)
    • 酷 .. 我建议你编辑@worte = {};也因为它会创建一个空哈希,这可能会导致你的 foreach 循环中出现错误,说未初始化的值
    • 我的原始代码更复杂,并且使用了不同的声明。如果您尝试制作一个简单的示例,这就是问题所在,有时您会遇到额外的错误。不过,我已经更正了我的简短示例以供将来参考。
    • 很酷,只要代码有效..!!永远不要编辑工作代码:P
    猜你喜欢
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 2014-06-18
    • 1970-01-01
    相关资源
    最近更新 更多