代码之家  ›  专栏  ›  技术社区  ›  iLoveWagons

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

  •  0
  • iLoveWagons  · 技术社区  · 8 年前

    我在我设法解决的一个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 回复  |  直到 8 年前
        1
  •  4
  •   Matt Jacob    8 年前

    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

        2
  •  0
  •   carlosn    8 年前

    处理数据结构可能很困难,这取决于它是如何制作的。

    我不确定您的“工作”数据结构是否正是这样,但:

    #!/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哈希时 阵列等;要提取各个 数据结构“树”,我们必须依次取消对每个级别的引用 达到原始数据结构,直到我们达到期望的水平 元素?

    这取决于您的数据结构是如何构建的,如果您已经知道要查找的内容,那么获取值将非常简单。例如:

    %城市代码=(

    a=>1,b=>2.

    );

    my$value=$city_codes{a};

    复杂的数据结构伴随着复杂的代码。