Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Perl:数组和散列_Arrays_Perl - Fatal编程技术网

Arrays Perl:数组和散列

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在事物和对该事物的引

除了找到我先前问题的答案之外,我再次陷入困境,看不出我做错了什么

我所拥有的是

数组(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在事物和对该事物的引用之间有着非常强烈的区别

%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'};

我还建议您可以轻松地直接使用引用,因为复杂的数据结构就是引用。从引用到值的来回转换令人困惑。与参考人合作是一件少的事情