perl循环遍历哈希数组

时间:2017-02-08 12:36:18

标签: perl loops syntax

您好在调试器中打印出以下变量$x

DB<8> x $x

0  ARRAY(0xdb09e20)

0  HASH(0xe18d450)

  'OBJECT_ID' => 111026746749824

  'TABLE_KEY' => '0-85296-384-X'

  'TABLE_KEY_NAME' => 'VALUE'

1  HASH(0xe18d4e0)

  'OBJECT_ID' => 1000000000108155

  'TABLE_KEY' => '1598-8740'

  'TABLE_KEY_NAME' => 'VALUE'

2  HASH(0xe18d530)

  'OBJECT_ID' => 1000000000108156

  'TABLE_KEY' => '89-7085-418-5'

  'TABLE_KEY_NAME' => 'VALUE'

我想循环浏览并访问每个OBJECT ID

我不知道使用什么语法。

以下是$x

的转储
[
  {
    OBJECT_ID      => 111026746749824,
    TABLE_KEY      => "0-85296-384-X",
    TABLE_KEY_NAME => "VALUE",
  },
  {
    OBJECT_ID      => 111026746749824,
    TABLE_KEY      => "0537-9987",
    TABLE_KEY_NAME => "VALUE",
  },
  {
    OBJECT_ID      => 1000000000108155,
    TABLE_KEY      => "89-7085-386-3",
    TABLE_KEY_NAME => "VALUE",
  },
  {
    OBJECT_ID      => 1000000000108155,
    TABLE_KEY      => "1598-8740",
    TABLE_KEY_NAME => "VALUE",
  },
  {
    OBJECT_ID      => 1000000000108156,
    TABLE_KEY      => "89-7085-418-5",
    TABLE_KEY_NAME => "VALUE",
  },
  {
    OBJECT_ID      => 1000000000108156,
    TABLE_KEY      => "1598-8651",
    TABLE_KEY_NAME => "VALUE",
  },
  {
    OBJECT_ID      => 1000000000108157,
    TABLE_KEY      => "89-7085-442-8",
    TABLE_KEY_NAME => "VALUE",
  },
  {
    OBJECT_ID      => 1000000000108157,
    TABLE_KEY      => "1598-8597",
    TABLE_KEY_NAME => "VALUE",
  },
]

2 个答案:

答案 0 :(得分:3)

看起来你有一个包含哈希引用作为元素的数组引用。

我可以告诉它这是一个数组引用,因为它是$x,其中$为sigil,表示引用,并且因为0 ARRAY(0xdb09e20)

所以,如果你print Dumper使用Data::Dumper它,你会得到这样的结果:

[
    {
        'OBJECT_ID'      => 111026746749824,
        'TABLE_KEY'      => '0-85296-384-X',
        'TABLE_KEY_NAME' => 'VALUE',
    },
    {
        'OBJECT_ID'      => 1000000000108155,
        'TABLE_KEY'      => '1598-8740',
        'TABLE_KEY_NAME' => 'VALUE',
    }
]

如果你在这个演示文稿中看一下,你需要做的事情变得非常明显。

首先,迭代数组引用中的元素,您必须取消引用它们。我在这里使用了一个非常详细的解除引用,因为如果你不确切地知道你在做什么,我觉得它更清晰。您也可以@$x

foreach my $elem ( @{ $x } ) {
    # ...
}

现在你有$elem,其中包含一个哈希引用。要获取OBJECT_ID密钥,您需要访问它。因为它是一个引用,所以你需要解引用运算符->

say $elem->{OBJECT_ID};

这将为一个元素打印出OBJECT_IDsayprint类似,带有换行符。您可以使用use feature 'say'加载它。

它像这样结合在一起:

use strict;
use warnings;
use feature 'say';

my $x = ...;

foreach my $elem ( @{ $x } ) {
    say $elem->{OBJECT_ID};
}

它将打印:

111026746749824
1000000000108155

要详细了解Perl中的引用,请查看perlrefperlreftut。您还可以在Perlmaven上查看这些教程:

答案 1 :(得分:0)

这将按照您的要求进行

my @ids = map { $_->{OBJECT_ID} } @$x;

say for @ids;

输出

111026746749824
111026746749824
1000000000108155
1000000000108155
1000000000108156
1000000000108156
1000000000108157
1000000000108157