如何递归地分配perl多维散列的键的值,其中该键类似于嵌套键的值?
假设我的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{'
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);
对不起,我的问题有误导性。但是,我觉得你和我的想法很接近。再次感谢你,老兄!是的,谢谢你。你把整个包裹都给我看了。那很酷。我想我的问题在这里解决了。