删除多维哈希中的每个最终值(perl)
Deleting each final value in multidimensional hash (perl)
我有一个多维散列(维数会有所不同),其中每个值要么是一个简单的标量值,要么是对另一个散列的引用。
有没有一个好的方法来删除每个最终值,保留指向其他哈希的元素?基本上,把骨架上的肉都去掉。
您需要编写自己的递归函数。像这样的东西(我还没有测试过):
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 中遍历数据结构时,我总是很难选择一个,而且问题也不是很复杂首先。所以到这里就完成了"by hand":
sub prune {
my ($href) = @_;
while (my ($key, $value) = each %$href) {
if (ref $value eq 'HASH') {
prune($value);
} else {
delete $href->{$key};
}
}
}
我有一个多维散列(维数会有所不同),其中每个值要么是一个简单的标量值,要么是对另一个散列的引用。
有没有一个好的方法来删除每个最终值,保留指向其他哈希的元素?基本上,把骨架上的肉都去掉。
您需要编写自己的递归函数。像这样的东西(我还没有测试过):
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 中遍历数据结构时,我总是很难选择一个,而且问题也不是很复杂首先。所以到这里就完成了"by hand":
sub prune {
my ($href) = @_;
while (my ($key, $value) = each %$href) {
if (ref $value eq 'HASH') {
prune($value);
} else {
delete $href->{$key};
}
}
}