【问题标题】:Perl :: Can You Have a Lists of Objects Within a Hash?Perl :: 你能在散列中有一个对象列表吗?
【发布时间】:2022-11-23 01:57:36
【问题描述】:

在 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);

输出是:

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' )
        };

唔。所以标量字符串是完整的,但令我惊讶的是我的 Person 对象列表似乎乱七八糟。可怜的 Alice Schwear 似乎以某种方式被“散列”为 undef。还有那个奇怪的Odd number of elements in hash assignment消息;我有散列中的条目,以及数组 @PersonArr 中的两个 Person 对象。两个哈希条目应该是偶数个元素,对吧......?

只是为了咯咯笑,我添加了第三人称,使代码如下:

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!

现在我的输出是这样的:

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

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

这里会发生什么?我很想了解发生了什么。更重要的是,如果它是可修复的,我很乐意修复此语法。谢谢你。

【问题讨论】:

    标签: list perl object hash


    【解决方案1】:
    my %outerHash = (
       'string' => $string,
       'PersonArr' => @PersonArr
    );
    

    也可以写成

    my %outerHash = ( 'string', $string, 'PersonArr', $PersonArr[0], $PersonArr[1] );
    

    或者

    my %outerHash = (
       string        => $string,
       PersonArr     => $PersonArr[0],
       $PersonArr[1] =>
    );
    

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

    my %outerHash = (
       string    => $string,
       PersonArr => @PersonArr,
    );
    

    【讨论】:

      猜你喜欢
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      相关资源
      最近更新 更多