如何从Perl数组中获取哈希值?

pb3s4cty  于 2022-12-13  发布在  Perl
关注(0)|答案(1)|浏览(202)

这是代码:

my @items = (); # this is the array
my %x = {}; # the hash I'm going to put into the array
$x{'aa'} = 'bb'; # fill it up with one key-value pair
push(@items, $x); # add it to the array
my %i = @items[0]; # taking it back
print $i{'aa'}; # taking the value by the key

我希望它能打印bb,但它什么也没打印。我做错了什么?

zujrkrfu

zujrkrfu1#

我做错了什么?
这可不是你想的那样

my %x = {};

您可以轻松检查:

use Data::Dumper;
print Dumper \%x;

输出:

Reference found where even-sized list expected at ./1.pl line 5.
$VAR1 = {
          'HASH(0x556a69fe8220)' => undef
        };

第一行来自use warnings;,如果你不用它,现在就开始。
为什么hash的内容如此奇怪呢?花括号创建了一个hash引用。因为键必须是字符串,所以引用被字符串化为HASH(0xADDR)。你不需要引用,你需要一个键和值的列表。

my %x = ();

实际上,每个哈希和数组都是空的,因此您不必使用任何内容:

my @items;
my %x;

或者,您可以直接填充它,而不是在下一行单独填充:

my %x = (aa => 'bb');

同样,这也行不通:

push @items, $x;

它将标量变量$x的值压入@items,但是没有这样的变量。看起来你没有使用use strict;。现在就开始吧,它会让你避免类似的错误。
您希望将哈希值推送到数组中,但数组值是标量,因此需要使用哈希值的引用。

push @items, \%x;

不,你想从数组中检索哈希值。同样,这是行不通的:

my %i = @items[0];

你提取的是一个值,因此,你不应该使用@。此外,我们现在在数组中有一个引用,要填充哈希值,我们需要先解引用它:

my %i = %{ $items[0] };

瞧,成功了!

#!/usr/bin/perl
use warnings;
use strict;

my @items;               # this is the array
my %x;                   # the hash I'm going to put into the array
$x{aa} = 'bb';           # fill it up with one key-value pair
push @items, \%x;        # add it to the array
my %i = %{ $items[0] };  # taking it back
print $i{aa};            # taking the value by the key

相关问题