我需要澄清数组的散列是如何工作的。我试图将一个元素数组添加到哈希中,然后检索它。
#!/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行之间有什么区别,谢谢。
答案 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::Dumper或Data::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'
]
];