2014-09-05 53 views
0

假设我的Perl多维散列如何递归地分配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} } 

所以哈希更换后,我该怎么做,使用递归函数/子程序时,我有一个大而深的哈希?

对不起,如果这个查询是重复的。无论如何,我试过但没有找到我满意的答案。

感谢极客。

回答

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; 
+0

对不起,我误导的问题。但是,我认为你非常接近我的想法。再次感谢好友! – user186889 2014-09-06 15:56:54

0

你可能想是这样的:

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

是的,谢谢你。你已经在这里向我展示了整个包装。这很酷。我认为我的问题在这里解决。 – user186889 2014-09-06 16:03:58

相关问题