Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 将散列分解为多个散列_Perl_Loops_Hash_Splice - Fatal编程技术网

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:The
delete
重置迭代器。条件只是检查哈希值是否为空。你认为会出现什么问题?我可以循环散列并删除循环中的元素吗?我想是的wrong@Jim:我
delete
map
之外。是的,但是在
之内,而
我也不理解这个代码:
delete@{$hash}{keys%{$hashes[-1]}
@Jim:The
delete
重置迭代器。条件只是检查哈希值是否为空。你认为会出什么问题?