Perl 将散列分解为多个散列
如果我有一个散列,我怎么能“分解”它/将它“分割”成包含相同数量键的多个散列?Perl 将散列分解为多个散列,perl,loops,hash,splice,Perl,Loops,Hash,Splice,如果我有一个散列,我怎么能“分解”它/将它“分割”成包含相同数量键的多个散列? 基本上,阵列中的拼接似乎接近我需要的(循环/切片),但这只适用于阵列。 那么最好的方法是什么呢? 更新: 或者删除最多X个键值的方法,以模拟阵列的拼接 更新 { foo => 1, bar => 2, bla =>3} 将来 { foo => 1 }, { bar => 2 }, { bla => 3 } if X = 1 or { foo => 1, bar
基本上,阵列中的拼接似乎接近我需要的(循环/切片),但这只适用于阵列。 那么最好的方法是什么呢?
更新:
或者删除最多X个键值的方法,以模拟阵列的拼接
更新
{ foo => 1, bar => 2, bla =>3}
将来
{ foo => 1 }, { bar => 2 }, { bla => 3 } if X = 1
or { foo => 1, bar => 2 }, { bla => 3 } if X = 2
or { foo => 1, bar => 2, bla => 3 } if X = 3
这应该是你想要的。在5.20+上,您可能可以使用新的slice语法来简化代码
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
sub split_hash {
my ($x, $hash) = @_;
my @hashes;
while (%$hash) {
my @k = keys %$hash;
push @hashes, { map each %$hash, 1 .. $x };
delete @{ $hash }{ keys %{ $hashes[-1] } };
}
return @hashes
}
print Dumper([ split_hash($_, { foo => 1,
bar => 2,
bla => 3,
}
)]) for 1 .. 3;
请注意,编写时,代码会删除原始散列。这应该是您想要的。在5.20+上,您可能可以使用新的slice语法来简化代码
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
sub split_hash {
my ($x, $hash) = @_;
my @hashes;
while (%$hash) {
my @k = keys %$hash;
push @hashes, { map each %$hash, 1 .. $x };
delete @{ $hash }{ keys %{ $hashes[-1] } };
}
return @hashes
}
print Dumper([ split_hash($_, { foo => 1,
bar => 2,
bla => 3,
}
)]) for 1 .. 3;
请注意,正如所写的,代码删除了原始散列。类似于@choroba提供的解决方案,但使用了splice,并且不修改传递的散列:
use Data::Dumper;
use strict;
use warnings;
sub split_hash {
my ( $x, $hash ) = @_;
my @keys = keys %$hash;
my @hashes;
while ( my @subset = splice( @keys, 0, $x ) ) {
push @hashes, { map { $_ => $hash->{$_} } @subset };
}
return \@hashes;
}
print Dumper( [
split_hash(
$_,
{
foo => 1,
bar => 2,
bla => 3,
} ) ] ) for 1 .. 3;
与@choroba提供的解决方案类似,但使用了splice,并且不修改传递的散列:
use Data::Dumper;
use strict;
use warnings;
sub split_hash {
my ( $x, $hash ) = @_;
my @keys = keys %$hash;
my @hashes;
while ( my @subset = splice( @keys, 0, $x ) ) {
push @hashes, { map { $_ => $hash->{$_} } @subset };
}
return \@hashes;
}
print Dumper( [
split_hash(
$_,
{
foo => 1,
bar => 2,
bla => 3,
} ) ] ) for 1 .. 3;
你能举个例子吗?你能举个例子吗?我能循环散列并删除循环中的元素吗?我想是的wrong@Jim:我
delete
在map
之外。是的,但是在之内,而我也不理解这个代码:delete@{$hash}{keys%{$hashes[-1]}
@Jim:Thedelete
重置迭代器。条件只是检查哈希值是否为空。你认为会出现什么问题?我可以循环散列并删除循环中的元素吗?我想是的wrong@Jim:我delete
在map
之外。是的,但是在之内,而我也不理解这个代码:delete@{$hash}{keys%{$hashes[-1]}
@Jim:Thedelete
重置迭代器。条件只是检查哈希值是否为空。你认为会出什么问题?