gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:26:18 25 4
gpt4 key购买 nike

在 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 了。还有奇怪的哈希分配中的元素数量为奇数消息;我在哈希中有两个 条目,在数组@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)完全从照片中消失了。

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

最佳答案

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

所以,

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

关于list - Perl::你能在哈希中拥有对象列表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74536901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com