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)完全从照片中消失了。
这里可能发生了什么?我很想了解发生了什么。更重要的是,如果可以修复的话,我很乐意修复这个语法。谢谢。
=>只是,自动引用左侧的一个幻想。所以,
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)