数组澄清的Perl哈希

时间:2014-04-02 08:33:36

标签: arrays perl hash

我需要澄清数组的散列是如何工作的。我试图将一个元素数组添加到哈希中,然后检索它。

#!/usr/bin/perl -w

use strict;
use diagnostics;

my %h;
my $key = "a";
my $val = "x";

push @{ $h{$key} }, $val;
print "1: " . $h{$key} . "\n";
print "2: " . $h{$key}[0] . "\n";

my @arr = $h{$key};
print "3: " . $arr[0] . "\n";

打印出来:

1: ARRAY(0x8ffe98)
2: x
3: ARRAY(0x8ffe98)

我想知道第2行和第3行之间有什么区别,谢谢。

3 个答案:

答案 0 :(得分:1)

my @arr = $h{$key};正在创建一个单个元素的数组 - array-ref,就像它被写成my @arr = ( $h{$key} );一样。也就是说,表达式,否则为dereference the array-ref

因此$arr[0](#3)评估的值与$h{$key}(#1)相同,而不是$h{$key}[0](#2)。

相反,请考虑使用取消引用的此表单,其中将结果列表分配给数组变量:

my @arr = @{ $h{$key} };

(现在$arr[0]将与$h{key}[0]相同。)

答案 1 :(得分:1)

您对这项任务感到有些困惑,因为您要将数组引用分配给数组:

my @arr = $h{$key};
print "3: " . $arr[0] . "\n";

上述作业相当于:

my ($ref) = $h{$key};
print "3: " . $ref . "\n";

您可以直观地看出,与您的打印#1相同。

如果您想将引用的值分配给新数组,则必须取消引用它:

my @arr = @{$h{$key}};

但是,对新阵列@arr的修改不会影响原始数据结构。

答案 2 :(得分:1)

问题已经得到解答,但是为了获得帮助,您应该使用一些数据转储实用程序,这有助于可视化发生的情况。例如Data::DumperData::Printer

e.g。使用Data :: Printer

#!/usr/bin/perl -w
use strict;
use diagnostics;
use DDP;

my %h;
my $key = "a";
my $val = "x";

p %h;
push @{ $h{$key} }, $val;
p %h;

my @arr = $h{$key};
p @arr;

打印:

{}

{
    a   [
        [0] "x"
    ]
}

[
    [0] [
        [0] "x"
    ]
]

使用Data :: Dumper

#!/usr/bin/perl -w

use strict;
use diagnostics;
use Data::Dumper;

my %h;
my $key = "a";
my $val = "x";

print Dumper \%h;
push @{ $h{$key} }, $val;
print Dumper \%h;

my @arr = $h{$key};
print Dumper \@arr;

打印类似的输出

$VAR1 = {};
$VAR1 = {
          'a' => [
                   'x'
                 ]
        };
$VAR1 = [
          [
            'x'
          ]
        ];