对x个数据结构取消引用x次

时间:2017-01-19 23:00:23

标签: arrays perl hash dereference

我在我的一个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行背后的语法。

我们的数据结构如下:

引用一个散列,其值是对填充数组的引用。

要提取数组的元素,我们必须: - 取消引用哈希引用,以便我们可以访问密钥 - 取消引用与键相关联的数组引用以提取元素。

最后的问题是:

  • 处理数组哈希的perl哈希时;提取"底部"各自的数据结构"树"我们必须依次取消引用每个级别以达到原始数据结构,直到我们获得所需的元素级别?

希望有人可以通过澄清帮助。

2 个答案:

答案 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

其他推荐阅读材料:perlrefperlreftutperldsc

答案 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};

复杂的数据结构带有复杂的代码。