我在我的一个perl脚本中遇到了一个障碍,我已经设法解决了这个问题,但我并不能理解为什么它的工作方式有效。我一直在网上搜索,但我还没有找到合适的解释。
我有一个子例程,它返回对数组哈希的引用。散列键是简单的字符串,值是对数组的引用。
我打印出与每个键相关的数组元素,比如
for my $job_name (keys %$build_numbers) {
print "$job_name => ";
my @array = @{@$build_numbers{$job_name}}; # line 3
for my $item ( @array ) {
print "$item \n";
}
}
虽然我能够打印出钥匙和钥匙。价值观,我不太了解第3行背后的语法。
我们的数据结构如下:
引用一个散列,其值是对填充数组的引用。
要提取数组的元素,我们必须: - 取消引用哈希引用,以便我们可以访问密钥 - 取消引用与键相关联的数组引用以提取元素。
最后的问题是:
希望有人可以通过澄清帮助。
答案 0 :(得分:4)
第3行正在使用slice哈希引用,但这是一种非常奇怪的方式来执行您尝试做的事情,因为a)您通常不会切片单个元素和b)更清晰,更明显的语法,使您的代码更容易阅读。
如果您的数据如下所示:
my $data = {
foo => [0 .. 9],
bar => ['A' .. 'F'],
};
然后您的示例的正确版本将是:
for my $key (keys(%$data)) {
print "$key => ";
for my $val (@{$data->{$key}}) {
print "$val ";
}
print "\n";
}
产生:
bar => A B C D E F
foo => 0 1 2 3 4 5 6 7 8 9
如果我理解您的第二个问题,答案是如果您使用正确的语法,则可以访问复杂数据结构的精确位置。例如:
print "$data->{bar}->[4]\n";
将打印E
。
其他推荐阅读材料:perlref,perlreftut和perldsc
答案 1 :(得分:0)
使用数据结构可能很难,具体取决于它的制作方式。
我不确定你的“工作”数据结构是否正是如此,但是:
#!/usr/bin/env perl
use strict;
use warnings;
use diagnostics;
my $hash_ref = {
job_one => [ 'one', 'two'],
job_two => [ '1','2'],
};
foreach my $job ( keys %{$hash_ref} ){
print " Job => $job\n";
my @array = @{$hash_ref->{$job}};
foreach my $item ( @array )
{
print "Job: $job Item $item\n";
}
}
您有一个哈希引用,您可以迭代作为数组的键。但是这个数组的每一项都可以是另一个引用或简单的标量。
基本上你可以使用ref或撤消ref,就像在第一个循环中一样。
您可以查看一份文档以获取更多详细信息here。
回答你的问题:
最后的问题是: - 当处理perl哈希的哈希值时 数组等;提取各自“底部”的元素 数据结构“树”我们必须依次取消引用每个级别 到达原始数据结构,直到我们获得所需的水平 元素?
这取决于您的数据结构是如何制作的,如果您已经知道要查找的内容,那么获取值就很简单:
%city_codes =(
a => 1,b => 2,
);
my $ value = $ city_codes {a};
复杂的数据结构带有复杂的代码。