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

如何使用哈希片初始化存储在数据结构中的哈希?

  •  6
  • emx  · 技术社区  · 15 年前

    在前面的一个问题中,我问了如何使用切片初始化Perl哈希。它是这样做的:

    my %hash = ();
    my @fields = ('currency_symbol', 'currency_name');
    my @array = ('BRL','Real');
    @hash{@fields} = @array;
    

    现在让我们想象一个更复杂的散列,这里是如何初始化它的:

    my %hash = ();
    my $iso = 'BR';
    $hash->{$iso}->{currency_symbol} = 'BRL';
    $hash->{$iso}->{currency_name} = 'Real';
    print Dumper($hash);
    

    结果如下:

    $VAR1 = {
              'BR' => {
                        'currency_symbol' => 'BRL',
                        'currency_name' => 'Real'
                      }
            };
    

    现在的问题是:如何使用splice方法初始化这个特定的散列?

    3 回复  |  直到 15 年前
        1
  •  3
  •   Greg Bacon    15 年前

    这个 perllol documentation's Slices section

    如果你想在多维数组中得到一个切片(一行的一部分),你就必须做一些有趣的订阅。这是因为虽然我们有一个很好的同义词,通过指针箭头取消引用的单个元素,没有这样的便利存在切片。(当然,请记住,始终可以编写循环来执行切片操作。)

    @AoA 像以前一样变化无常。

    @part = ();
    $x = 4;
    for ($y = 7; $y < 13; $y++) {
      push @part, $AoA[$x][$y];
    }
    

    同样的循环可以替换为切片操作:

    @part = @{ $AoA[4] } [ 7..12 ];
    

    外推到散列切片,我们得到

    @{ $hash{$iso} }{@fields} = @array;
    

        2
  •  2
  •   Axeman maxelost    15 年前

    %hash $hash{ $iso } . $hash->{ $iso } 指哈希表中由指向的插槽 $hash ,可能指向也可能不指向 %散列 .

    但一旦你做到了,你可以做以下事情:

    @{ $hash{ $iso } }{ @fields } = qw<BRL Real>;
    

    但是,当水平很快变得复杂时,最好放弃这种自我活化的奢侈,做以下几点:

    my $h = $hash{ $iso }{blah}{blah} = {};
    @$h{ @field_names } = @field_values;
    

    哈希层次结构中的可重定位指针使编写匿名访问变得更容易,匿名访问也允许简单的切片。

        3
  •  1
  •   ysth    15 年前

    $hash{$iso} 将是一个哈希引用。将简单切片中的变量名(不带sigil)替换为包含引用的块,因此:

    @array{@list}
    

    变成

    @{ $hash{$iso} }{@list}
    

    看到了吗 http://perlmonks.org/?node=References+quick+reference