【发布时间】:2017-02-24 06:44:18
【问题描述】:
除了找到我之前的问题Perl: slicing an array of hashes 的答案之外,我再次陷入困境,无法看到我做错了什么。
我拥有的是
Array(Array0(Hash0,Hash1),Array1(Hash0,Hash1),Array2(Hash0,Hash1)...)
use strict;
use warnings;
my @DDs = ();
my @Ds = ();
my %hsh = ();
my %dot1 = ( 'x' => 1, 'y' => 2, 'r' => 3 );
my %dot2 = ( 'x' => 4, 'y' => 5, 'r' => 6 );
my %dot3 = ( 'x' => 7, 'y' => 8, 'r' => 9 );
my %dot4 = ( 'x' => 1.1, 'y' => 1.2, 'r' => 1.3 );
my %dot5 = ( 'x' => 2.1, 'y' => 2.2, 'r' => 2.3 );
my %dot6 = ( 'x' => 3.1, 'y' => 3.2, 'r' => 3.3 );
my %dot7 = ( 'x' => 4.1, 'y' => 4.2, 'r' => 4.3 );
my %dot8 = ( 'x' => 5.1, 'y' => 5.2, 'r' => 5.3 );
my @dotsA = ( \%dot1, \%dot2 );
my @dotsB = ( \%dot3, \%dot4 );
my @dotsC = ( \%dot5, \%dot6 );
my @dotsD = ( \%dot7, \%dot8 );
my %Ds = ( \@dotsA, \@dotsB, \@dotsC, \@dotsD );
@DDs = $Ds[1]; #expect @dotsB with scalar of 2
###"Can't use an undefined value as HASH reference" error here
%hsh = %{ $DDs[0] }; #expect %dot3
print scalar @DDs, "\n"; #expect 2 but has value of 1
print $hsh{'x'}, "\n";
【问题讨论】:
-
您同时拥有
%Ds和@Ds。您分配给%Ds,但@Ds仍然为空。$Ds[1]从@Ds中选择一个值,这当然是未定义的,因为其中没有任何内容。@DDs成为一个包含 1 个未定义标量的数组。$DDs[0]是未定义的标量。 -
使用数字后缀(
%dot1、%dot2)命名变量是主要的代码异味。你能解释一下你到底想要达到什么目的吗?几乎可以肯定有一种更清洁的方法。 -
@ThisSuitIsBlackNot,数字后缀并不打算在最终版本中使用,只是测试这种特殊方法。尝试创建具有多个属性的项目“系列”(为了测试,我选择了具有 x、y 坐标和半径的点)。这些项目哈希被分组到一个家庭数组中(测试中的两个项目)。家庭属于“群体”。尝试针对组中的项目属性运行测试,然后允许将一些项目系列推入组中。 .