Arrays Perl:数组和散列
除了找到我先前问题的答案之外,我再次陷入困境,看不出我做错了什么 我所拥有的是 数组(Array0(Hash0,Hash1)、Array1(Hash0,Hash1)、Array2(Hash0,Hash1)…) 在/Users/schwern/tmp/test.plx第10行中找到了预期大小相等的列表 第10行是:Arrays Perl:数组和散列,arrays,perl,Arrays,Perl,除了找到我先前问题的答案之外,我再次陷入困境,看不出我做错了什么 我所拥有的是 数组(Array0(Hash0,Hash1)、Array1(Hash0,Hash1)、Array2(Hash0,Hash1)…) 在/Users/schwern/tmp/test.plx第10行中找到了预期大小相等的列表 第10行是: my %dot1 = {'x'=>1,'y'=>2,'r'=>3}; 这是Perl的一种神秘方式,表示您将散列引用提供给散列。不幸的是,Perl在事物和对该事物的引
my %dot1 = {'x'=>1,'y'=>2,'r'=>3};
这是Perl的一种神秘方式,表示您将散列引用提供给散列。不幸的是,Perl在事物和对该事物的引用之间有着非常强烈的区别
%dot1
是散列。它获取一个列表并将其转换为散列。类似于(x=>1,y=>2,r=>3)
的列表<代码>{x=>1,y=>2,r=>3}创建哈希引用。这是一个单一的东西,一个标量。这就像说my%dot1=(42)
。这没有任何意义
- %dot1是一个散列,它需要一个类似于
(x=>1,y=>2)的列表
- $dot1是一个标量,它可以存储类似于
的散列引用{x=>1,y=>2}
散列需要一个键和一个值,对<代码>姓氏=>“Schwern”。当你给它一堆这样的数组引用时,它会把它们读作key1,value1,key2,value2。。。但是它用什么作为钥匙呢?它使用该引用的字符串化,类似于
数组(0x7fb721800468)
如果您请求$D{\@dotsA}
,您将获得对@dotsB
的引用。您将无法返回@dotsA
,Perl哈希键只是一个字符串,而不是引用
这不是在散列中存储数组的好方法。我不确定你想完成什么,但你可能想通过名字来引用它们
# A hash of lists.
my %Ds = ( A => \@dotsA, B => \@dotsB, C => \@dotsC, D => \@dotsD );
# Get back a reference to @dotsA.
my $dotsA = $Ds{A};
但是看看下面的代码,@DDs=$Ds[1]
,我想你是想初始化@Ds
而不是%Ds
@Ds = (\@dotsA,\@dotsB,\@dotsC,\@dotsD);
下面的作品。。。某种程度上。以后再说
@DDs = $Ds[1]; #expect @dotsB with scalar of 2
与PHP不同,哈希和数组是完全不同的东西my@Ds
和my%Ds
声明完全不同的变量。使用$Ds
访问这两个文件并没有帮助。在Perl5中,符号表示将返回的内容$Ds[1]
和$Ds{foo}
都使用$Ds
,因为它们返回的是标量@Ds[1,2]
和@Ds{(foo,bar)}
使用@Ds
,因为它们返回的是一个列表(称为切片)。令人困惑,但这就是它的工作原理
#!/usr/bin/perl
use strict;
use warnings;
use v5.10; # for say()
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);
my @DDs = @{$Ds[1]}; #expect @dotsB
my %hsh = %{$DDs[0]}; #expect %dot3
say scalar @DDs; #expect 2
say $hsh{'x'};
您没有获得
@dotsB
,而是获得了对@dotsB
的引用。Perl中的所有复杂数据结构都存储引用,而不是实际值。这就像$DDs[0]=\@dotsB
。如果要获得实际值,必须取消对它的引用
@DDs = @{$Ds[1]}; # Now @DDs has a copy of @dotsB
最后它成功了
#!/usr/bin/perl
use strict;
use warnings;
use v5.10; # for say()
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);
my @DDs = @{$Ds[1]}; #expect @dotsB
my %hsh = %{$DDs[0]}; #expect %dot3
say scalar @DDs; #expect 2
say $hsh{'x'};
我还建议您可以轻松地直接使用引用,因为复杂的数据结构就是引用。从引用到值的来回转换令人困惑。使用引用在您的代码中、在您的头脑中转换的事情更少,在您的程序中进行的复制也更少
#!/usr/bin/perl
use strict;
use warnings;
use v5.10; # for say()
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];
my $DDs = $Ds->[1]; #expect $dotsB
my $hsh = $DDs->[0]; #expect $dot3
say scalar @$DDs; #expect 2
say $hsh->{'x'};
你应该复习和复习 在/Users/schwern/tmp/test.plx第10行中找到了预期大小相等的列表 第10行是:
my %dot1 = {'x'=>1,'y'=>2,'r'=>3};
这是Perl的一种神秘方式,表示您将散列引用提供给散列。不幸的是,Perl在事物和对该事物的引用之间有着非常强烈的区别
%dot1
是散列。它获取一个列表并将其转换为散列。类似于(x=>1,y=>2,r=>3)
的列表<代码>{x=>1,y=>2,r=>3}创建哈希引用。这是一个单一的东西,一个标量。这就像说my%dot1=(42)
。这没有任何意义
- %dot1是一个散列,它需要一个类似于
(x=>1,y=>2)的列表
- $dot1是一个标量,它可以存储类似于
的散列引用{x=>1,y=>2}
散列需要一个键和一个值,对<代码>姓氏=>“Schwern”。当你给它一堆这样的数组引用时,它会把它们读作key1,value1,key2,value2。。。但是它用什么作为钥匙呢?它使用该引用的字符串化,类似于
数组(0x7fb721800468)
如果您请求$D{\@dotsA}
,您将获得对@dotsB
的引用。您将无法返回@dotsA
,Perl哈希键只是一个字符串,而不是引用
这不是在散列中存储数组的好方法。我不确定你想完成什么,但你可能想通过名字来引用它们
# A hash of lists.
my %Ds = ( A => \@dotsA, B => \@dotsB, C => \@dotsC, D => \@dotsD );
# Get back a reference to @dotsA.
my $dotsA = $Ds{A};
但是看看下面的代码,@DDs=$Ds[1]
,我想你是想初始化@Ds
而不是%Ds
@Ds = (\@dotsA,\@dotsB,\@dotsC,\@dotsD);
下面的作品。。。某种程度上。以后再说
@DDs = $Ds[1]; #expect @dotsB with scalar of 2
与PHP不同,哈希和数组是完全不同的东西my@Ds
和my%Ds
声明完全不同的变量。使用$Ds
访问这两个文件并没有帮助。在Perl5中,符号表示将返回的内容$Ds[1]
和$Ds{foo}
都使用$Ds
,因为它们返回的是标量@Ds[1,2]
和@Ds{(foo,bar)}
使用@Ds
,因为它们返回的是一个列表(称为切片)。令人困惑,但这就是它的工作原理
#!/usr/bin/perl
use strict;
use warnings;
use v5.10; # for say()
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);
my @DDs = @{$Ds[1]}; #expect @dotsB
my %hsh = %{$DDs[0]}; #expect %dot3
say scalar @DDs; #expect 2
say $hsh{'x'};
您没有获得
@dotsB
,而是获得了对@dotsB
的引用。Perl中的所有复杂数据结构都存储引用,而不是实际值。这就像$DDs[0]=\@dotsB
。如果要获得实际值,必须取消对它的引用
@DDs = @{$Ds[1]}; # Now @DDs has a copy of @dotsB
最后它成功了
#!/usr/bin/perl
use strict;
use warnings;
use v5.10; # for say()
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);
my @DDs = @{$Ds[1]}; #expect @dotsB
my %hsh = %{$DDs[0]}; #expect %dot3
say scalar @DDs; #expect 2
say $hsh{'x'};
我还建议您可以轻松地直接使用引用,因为复杂的数据结构就是引用。从引用到值的来回转换令人困惑。与参考人合作是一件少的事情