【发布时间】: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 个人)完全从照片中消失了。
这里会发生什么?我很想了解发生了什么。更重要的是,如果它是可修复的,我很乐意修复此语法。谢谢你。
【问题讨论】: