如何递归地分配 perl 多维哈希的键的值,其中该键类似于嵌套键的值?

Posted

技术标签:

【中文标题】如何递归地分配 perl 多维哈希的键的值,其中该键类似于嵌套键的值?【英文标题】:How to recursively assign values of a key of a perl multi-dimensional hash where that key is similar to value of a nested key? 【发布时间】:2014-10-29 22:07:03 【问题描述】:

假设我的 Perl 多维散列是

my %test;
$test'1' =   'x'=>0, 'y'=>0 ;
$test'2' =   'x'=>1, 'y'=>0 ;
$test'3' =   'x'=>1, 'y'=>2 ;
$test'4' =   'x'=>3, 'y'=>2 ;

这里,键 3 类似于嵌套键 x 的值 test'4'。我想要的只是用与嵌套键的值匹配的特定哈希替换那些嵌套键的值。 这样,例如,test'4' 在替换为 test'3'test'2' 键的哈希后的样子

$test'4'= 'x'=> 'x'=>1,'y'=>2 'y'=>  'x'=> 1,'y'=> 0 

那么,当我有一个大的深度散列时,我该如何使用递归函数/子例程呢?

抱歉,如果此查询重复。无论如何,我尝试了但没有找到满意的答案。

感谢极客。

【问题讨论】:

【参考方案1】:

您的问题定义远未完成,但这应该接近您的需求:

use strict;
use Data::Dumper;

sub self_substitute 

  my $h = shift;

  my $help; $help = sub 
    my $val = shift;
    if (ref $val eq "HASH") 
      my $new_val = ;
      while ( my ($hash_key, $hash_val) = each %$val ) 
        $new_val->$hash_key = $help->($hash_val);
      
      $new_val
    
    else 
      exists $h->$val ? $h->$val : $val
    
  ;

  $help->($h);


sub main 

  my %test;
  $test'1' =   'x'=>0, 'y'=>0 ;
  $test'2' =   'x'=>1, 'y'=>0 ;
  $test'3' =   'x'=>1, 'y'=>2 ;
  $test'4' =   'x'=>3, 'y'=>2 ;

  my $result = self_substitute(\%test);
  print Dumper($result)


main;

【讨论】:

抱歉我的误导性问题。但是,我认为你和我的想法非常接近。再次感谢哥们!【参考方案2】:

你可能想要这样的东西:

use strict;
use warnings;
use Data::Dumper;

my %test = ( 
    1 =>   'x'=>0, 'y'=>0 ,
    2 =>   'x'=>1, 'y'=>0 ,
    3 =>   'x'=>1, 'y'=>2 ,
    4 =>   'x'=>3, 'y'=>2 ,
    );

my $result = makeNext(\%test, \%test);
print Dumper($result)."\n";

sub makeNext 
    my ( $orig, $obj ) = @_;
    if ( ref($obj) eq 'HASH' ) 
        return  map  $_, makeNext($orig, $obj->$_)  keys %$obj ;
    
    elsif ( exists($orig->$obj) ) 
        return makeNext($orig, $orig->$obj)
    
    else 
        return $obj;
    

如果您只关心打印结果,您可以一次性完成。 这只是在任何地方都引用了正确的东西,所以深印可以正常工作,但操作会出现问题。

my %test = ( 
    1 =>   'x'=>0, 'y'=>0 ,
    2 =>   'x'=>1, 'y'=>0 ,
    3 =>   'x'=>1, 'y'=>2 ,
    4 =>   'x'=>3, 'y'=>2 ,
    );

foreach my $index (keys %test) 
    foreach my $key (keys %$test$index) 
        $test$index$key = $test$test$index$key if exists($test$test$index$key);
    

$Data::Dumper::Deepcopy = 1;
print Dumper(\%test);

【讨论】:

是的,谢谢。你在这里向我展示了整个包裹。这很酷。我想我的问题在这里解决了。

以上是关于如何递归地分配 perl 多维哈希的键的值,其中该键类似于嵌套键的值?的主要内容,如果未能解决你的问题,请参考以下文章

从 Perl 中的哈希中获取具有最高值的键的最简单方法是啥?

Perl:组合两个哈希数组的值并使第二个数组的值成为输出哈希的键

哈希中每个键的不同类型的值

如何返回总和小于最大值的键的哈希对?

python 一个由字典构成的列表,修改其中1个字典的键的值,却把该列表所有字典相同的键的值都一起修改了?

如何更改哈希映射中键的值? [复制]