Perl :: 你能在哈希中拥有对象列表吗?

Pet*_*ete 2 perl hash list object

在 Perl (v5.30.0) 中,我有一个脚本,它将一些标量和对象列表放入“容器”哈希中。对象列表似乎有问题,但我不确定我做错了什么。

这是我的代码:

#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;

package Person;
sub new
{
        my $type = shift;
        my %params = @_;
        my $self = {};
        $self->{'firstName'} = $params{'firstName'};
        $self->{'lastName'} = $params{'lastName'};
        bless $self, $type;
}

package main;

# I make a string:
my $string = "Some metadata...";

# I make a list of objects:
my @PersonArr = ();
push @PersonArr, Person->new( 'firstName' => "John", 'lastName' => "Schmitt" );
push @PersonArr, Person->new( 'firstName' => "Alice", 'lastName' => "Schwear" );

# I put the above into a hash:
my %outerHash = ( 'string' => $string,                  # LINE 28
        'PersonArr' => @PersonArr
);

print Dumper(\%outerHash);
Run Code Online (Sandbox Code Playgroud)

输出是:

Odd number of elements in hash assignment at ./HashTest.perl line 28.
$VAR1 = {
          'Person=HASH(0x5559c89e8008)' => undef,
          'string' => 'Some metadata...',
          'PersonArr' => bless( {
                                  'firstName' => 'John',
                                  'lastName' => 'Schmitt'
                                }, 'Person' )
        };
Run Code Online (Sandbox Code Playgroud)

唔。所以标量字符串是完整的,但令我惊讶的是我的Person对象列表似乎是凌乱的。可怜的爱丽丝·施韦尔似乎已经被“散列”了undef。还有那个奇怪的Odd number of elements in hash assignment信息;我在 hash 中有两个Person条目,在 array 中有两个对象@PersonArr。两个哈希条目应该是偶数个元素,对吧......?

为了搞笑,我添加了第三个人,使代码如下:

push @PersonArr, Person->new( 'firstName' => "John", 'lastName' => "Schmitt" );
push @PersonArr, Person->new( 'firstName' => "Alice", 'lastName' => "Schwear" );
push @PersonArr, Person->new( 'firstName' => "Ruby", 'lastName' => "Baker" );  # NEW!
Run Code Online (Sandbox Code Playgroud)

现在我的输出是这样的:

$VAR1 = {
          'PersonArr' => bless( {
                                  'firstName' => 'John',
                                  'lastName' => 'Schmitt'
                                }, 'Person' ),
          'Person=HASH(0x56350cc57008)' => bless( {
                                                    'lastName' => 'Baker',
                                                    'firstName' => 'Ruby'
                                                  }, 'Person' ),
          'string' => 'Some metadata...'
        };
Run Code Online (Sandbox Code Playgroud)

越来越好奇了。Odd number of elements in hash assignment这次没有错误了。虽然约翰(#1)和鲁比(#3)是可见的,但爱丽丝(#2)完全从照片中消失了。

这里可能发生了什么?我很想了解发生了什么。更重要的是,如果可以修复的话,我很乐意修复这个语法。谢谢。

ike*_*ami 5

  • =>只是,自动引用左侧的一个幻想。
  • 列表上下文中的数组生成数组的值。

所以,

my %outerHash = (
   'string' => $string,
   'PersonArr' => @PersonArr
);
Run Code Online (Sandbox Code Playgroud)

方法

my %outerHash = ( 'string', $string, 'PersonArr', $PersonArr[0], $PersonArr[1] );
Run Code Online (Sandbox Code Playgroud)

如果我们这样写,我们会得到

my %outerHash = (
   string        => $string,
   PersonArr     => $PersonArr[0],
   $PersonArr[1] =>
);
Run Code Online (Sandbox Code Playgroud)

哈希值只能是标量。但引用是标量,因此哈希值可以是对数组的引用。

my %outerHash = (
   string    => $string,
   PersonArr => \@PersonArr,
);
Run Code Online (Sandbox Code Playgroud)