Perl嵌套结构

ado*_*ado 2 perl

我有一个关于Perl中复杂结构的问题

my $data1 = [
  +{ id => 1, name => 'A' },
  +{ id => 2, name => 'B' },
  +{ id => 3, name => 'C' },
];

my $data3 = +{
   1 => +{ id => 1, name => 'A' },
   2 => +{ id => 2, name => 'B' },
   3 => +{ id => 3, name => 'C' },
};
Run Code Online (Sandbox Code Playgroud)

我该如何打印"B"?那是什么样的数据结构?有关Perl嵌套结构(哈希引用,数组引用等)的任何好的参考都可以理解吗?

先感谢您

Gil*_*not 6

试着这样做:

print $data1->[1]->{name}; # ARRAY ref
print $data3->{2}->{name}; # HASH ref
Run Code Online (Sandbox Code Playgroud)

这是来自perl ARRAY和HASH ref的de-reference.

-> 去参考明确.它仅用于第一个"楼层",例如:

print $data1->[1]{name};
print $data3->{2}{name};
Run Code Online (Sandbox Code Playgroud)

也工作.第二个和更多是选项.

就像Chris Charley说的那样,看看有关数据结构教程


为了帮助您理解标量ref的外观,请使用Data :: Dumper,例如:

print Dumper $data1;
print Dumper $data3;
Run Code Online (Sandbox Code Playgroud)

应输出:

$VAR1 = [
          {
            'name' => 'A',
            'id' => 1
          },
          {
            'name' => 'B',
            'id' => 2
          },
          {
            'name' => 'C',
            'id' => 3
          }
        ];
$VAR1 = {
          '1' => {
                   'name' => 'A',
                   'id' => 1
                 },
          '3' => {
                   'name' => 'C',
                   'id' => 3
                 },
          '2' => {
                   'name' => 'B',
                   'id' => 2
                 }
        };
Run Code Online (Sandbox Code Playgroud)

对于+{ }语法,rra给出了很好的响应:

在可以将大括号作为代码块而不是匿名散列引用的地方消除歧义,但很少需要这样做.我猜测代码中包含的内容是出于一种错位的愿望,即要明确并与可能含糊不清的地方保持一致.

  • 请注意,您不必总是明确解除引用.在第一个` - >之后,使用它们中的更多来取消引用是可选的 - `$ data1 - > [1] {name}`相当于`$ data1 - > [1] - > {name}`. (2认同)