【问题标题】:Iterating over data structure迭代数据结构
【发布时间】:2011-08-29 14:32:22
【问题描述】:

我正在尝试迭代这个数据结构:

$deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}[0]->{code}

fact[0] 正在增加。我正在处理几个文件,所以{facts}[x] 的数量会有所不同。

我认为这可能有效,但似乎并没有加强$iter var:

foreach $iter(@{$deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}}){
  print $deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}[$iter]->{code}."\n";
}

我完全在挖掘数据结构,但这个让我很困惑。任何建议这里可能有什么问题?

【问题讨论】:

  • $iter 已经你想要得到的。只需print $iter . "\n"

标签: perl data-structures iterator complex-data-types


【解决方案1】:

$iter 被设置为数组中每个项目的内容而不是索引。例如

my $a = [ 'a', 'b', 'c' ];
for my $i (@$a) {
    print "$i\n";
}

...打印:

a
b
c

试试:

foreach $iter (@{$deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}}){
    print $iter->{code}."\n";
}

【讨论】:

  • Unk,你是第一个,所以你得到了因果报应。所有这些答案都很棒!珍妮
  • 您可以为您喜欢的每个答案投票,并检查最先/最好解决您问题的答案是否正确。
  • Mugen 也为你点赞!谢谢!
【解决方案2】:

$iter 不会是数组下标的索引,而是数组的当前元素。所以我想你应该没问题:

$iter->{code}

【讨论】:

    【解决方案3】:

    您的 $iter 包含数据结构。你基本上想要的是:

    foreach my $elem ( @{$deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}} ){
        print $elem->{code};
    }
    

    或:

    foreach my $iter ( 0 .. scalar @{$deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}} ){
        print $deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}[$iter]->{code}."\n";
    }
    

    【讨论】:

      【解决方案4】:

      由于您正在遍历数组,因此您错误命名的 $iter 是您要查找的值,而不是索引。 如果您想循环遍历索引,请执行以下操作:

      foreach $iter ( 0 .. $#{$deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}} ) {
          print "Index $iter: ",
              $deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}[$iter]->{code}."\n";
      }
      

      另请注意,您可以将-> 放在两个[]{} 之间:

      $deconstructed->{data}{workspaces}[0]{workspace}{facts}[$iter]{code}
      

      我推荐阅读http://perlmonks.org/?node=References+quick+reference

      【讨论】:

        【解决方案5】:

        当你有这样丑陋的数据结构时,为它创建一个接口,这样你的生活会更轻松:

         foreach my $fact ( $data_obj->facts ) {  # make some lightweight class for this
             ....;
             }
        

        即使没有,也可以考虑仅使用对您需要的数据结构部分的引用,这样您就不必考虑其余部分:

         my $facts = $deconstructed->{data}{workspaces}[0]{workspace}{facts};
         foreach my $fact ( @$facts ) {
             print "Thing is $fact->{code}\n";
             }
        

        这只是一个参考,所以你没有重新创建任何东西。由于您只需要考虑facts 键之外的部分,因此问题看起来并不难。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-25
          • 1970-01-01
          • 1970-01-01
          • 2021-03-01
          • 2016-08-26
          • 2017-08-25
          • 2011-03-15
          相关资源
          最近更新 更多