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

如何递归地分配perl多维散列的键的值,其中该键类似于嵌套键的值?,perl,hash,multidimensional-array,Perl,Hash,Multidimensional Array,假设我的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类似于test{'4'}的嵌套键x的值。我只想用与嵌套键的值匹配的特定散列替换这些嵌套键的值。 这样,例如,test{'

假设我的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
类似于
test{'4'}
的嵌套键
x
的值。我只想用与嵌套键的值匹配的特定散列替换这些嵌套键的值。 这样,例如,
test{'4'}
在被
test{'3'}
test{'2'}
键的散列替换后看起来像这样

$test{'4'}={ 'x'=> {'x'=>1,'y'=>2} 'y'=> { 'x'=> 1,'y'=> 0} }
那么,当我有一个大的深度散列时,如何使用递归函数/子例程来实现这一点呢

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


感谢极客。

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

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;

你可能想要这样的东西:

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);

对不起,我的问题有误导性。但是,我觉得你和我的想法很接近。再次感谢你,老兄!是的,谢谢你。你把整个包裹都给我看了。那很酷。我想我的问题在这里解决了。