Perl中的“不是阵列参考”

时间:2019-04-06 18:07:58

标签: perl

我是Perl的新手,并试图适应Perl中的数据结构和引用。

我学到了

  • key %hash返回%hash中的键数组
  • \{ @array }返回对@array
  • 的引用

所以我将两者结合起来,写了这样的内容,

use strict;
use warnings;
use Data::Dumper;

my $hash = {
    key1 => 'value1',
    key2 => 'value2'
};

my $keys = \{ keys %$hash }; # Supposed to be an array reference?

print Dumper $keys; # Output 1
print Dumper $keys->[0]; # Output 2

,它在Not an ARRAY reference行产生错误Output 2。另外,Output 1显示的内容看起来像是哈希引用,尽管它应该是数组引用。

我的代码怎么了?

类似地,以下代码在出现相同错误时不起作用。

use strict;
use warnings;

my $array = [1, 2, 3, 4, 5];
my $first_two = \{ @{ $array }[0..1] }; # Isn't it an array ref?
my $first = $first_two->[0];

我想我对数组引用有误解。

1 个答案:

答案 0 :(得分:6)

您遇到的问题是这是不正确的:'\{ @array } returns the reference to the @array'。取而代之的是,\只是添加到现有变量之前,例如:\@array。大括号{}用于创建匿名 hash 引用,括号[]用于创建匿名 array 引用。

在您的示例中,您要做的是(1)将密钥存储为数组,然后使用\获取引用:

my @keys = keys %$hash;
my $keys = \@keys;

或者(2)使用匿名数组引用:

my $keys = [ keys %$hash ];

这是一个很好的“参考”;)https://perldoc.perl.org/perlref.html#Making-References