【问题标题】:Slicing a nested hash in Perl在 Perl 中对嵌套散列进行切片
【发布时间】:2012-09-17 17:04:38
【问题描述】:

假设我有一个可以索引为的哈希:

$hash{$document}{$word}

根据我在网上阅读的内容(尽管我在 perlreftutperldscperllol 上找不到此内容),如果我在哈希上使用 @ 前缀来表示,我可以使用列表来分割哈希我希望哈希返回一个列表。但是,如果我尝试使用列表@list 来分割我的哈希:

@%hash{$document}{@list}

我收到几个"Scalar values ... better written" 错误。

如何在 Perl 中删除嵌套哈希?

【问题讨论】:

    标签: perl hash slice


    【解决方案1】:

    你的哈希符号必须是@,像这样:

    @{$hash{$document}}{@list}
    

    假设@list 包含%hash 的有效键,它将返回相应的值,如果键不存在,则返回undef

    这是基于哈希切片的一般规则:

    %foo = ( a => 1, b => 2, c => 3 );
    print @foo{'a','b'};               # prints 12
    %bar = ( foo => \%foo );           # foo is now a reference in %bar
    print @{ $bar{foo} }{'a','b'};     # prints 12, same data as before
    

    【讨论】:

      【解决方案2】:

      首先,当您希望从哈希切片中获取列表时,请先使用@ sigil。 % 在这里毫无意义。

      其次,您应该了解$hash{$document} 值不是散列或数组。它是对哈希或数组的引用。

      说了这么多,你可能会使用这样的东西:

      @{ $hash{$document} }{ @list };
      

      ...所以你取消引用$hash{$document} 的值,然后在它上面使用一个散列片。例如:

      my %hash = (
          'one' => {
              'first'  => 1,
              'second' => 2,
           },
           'two' => {
              'third'  => 3,
              'fourth' => 4,
           } 
      );
      
      my $key  = 'one';
      my @list = ('first', 'second');
      
      print $_, "\n" for @{ $hash{$key} }{@list};
      # ...gives 1\n2\n
      

      【讨论】:

        猜你喜欢
        • 2013-03-14
        • 1970-01-01
        • 2013-01-30
        • 2021-11-19
        • 2011-07-17
        • 2017-02-08
        • 2017-07-30
        • 2020-08-27
        相关资源
        最近更新 更多