【问题标题】:Deleting each final value in multidimensional hash (perl)删除多维哈希中的每个最终值(perl)
【发布时间】:2016-06-23 06:41:01
【问题描述】:

我有一个多维散列(维数会有所不同),其中每个值要么是简单的标量值,要么是对另一个散列的引用。

有没有删除每个最终值的好方法,保留指向其他哈希的元素?基本上,把骨架上的肉都去掉。

【问题讨论】:

  • 如果你展示了你的哈希样本和你想要的结果,这会很有帮助。当您说“删除每个最终值”时,您是想完全删除哈希元素,包括键,还是只想将值设置为undef
  • $VAR1 = { 'Peti Bar' => { '数学' => 82, '艺术' => 99, '文学' => 88 }, 'Foo Bar' => { '数学' => 97, '文学' => 67 } };

标签: perl hash perl-data-structures


【解决方案1】:

我怀疑那里有一些很好的模块可以帮助解决这个问题,可能有几个,但是在 Perl 中遍历数据结构时我总是很难选择一个,而且这个问题一开始并不是很复杂和。所以这里是“手工”完成的:

sub prune {
  my ($href) = @_;
  while (my ($key, $value) = each %$href) {
    if (ref $value eq 'HASH') {
      prune($value);
    } else {
      delete $href->{$key};
    }
  }
}

【讨论】:

    【解决方案2】:

    您需要编写自己的递归函数。像这样的东西(我没有测试过):

    sub cleanHash($)
    {
        my $hash = $_[0];
        foreach my $k ( keys( %$hash ) )
        {
            if( ref( $hash->{$k} ) eq 'HASH' )
            {
                cleanHash( $hash->{$k} );
            }
            else
            {
                delete( $hash->{$k} );
            }
        }
    } # END cleanHash
    
    my %h;
    ....
    cleanHash( \%h );
    

    【讨论】:

    • 你应该永远在你的 Perl 子例程中使用原型。它们与大多数语言的原型不同,可能不会做你想做的事。最好使用snake_case 作为本地标识符。大写字母保留给全局变量,例如包名。
    猜你喜欢
    • 2012-09-06
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 2014-05-27
    • 2011-12-10
    • 2015-12-18
    相关资源
    最近更新 更多