如果我有哈希,我怎么能打破"打破"它/"分裂"它分为多个包含相同数量键的哈希?
基本上,数组中的拼接似乎接近我所需要的(循环/切片),但这仅适用于数组。
那么最好的方法是什么呢?
更新
或者最多删除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
答案 0 :(得分:2)
这应该做你想要的。在5.20+上,您可以使用新的切片语法来简化代码。
#!/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;
请注意,编写后,代码会删除原始哈希值。
答案 1 :(得分:1)
与@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;