perl—所有可能的哈希组合
告诉我如何获得哈希的所有可能组合 以下是一个示例perl—所有可能的哈希组合,perl,hash,combinations,Perl,Hash,Combinations,告诉我如何获得哈希的所有可能组合 以下是一个示例 my %data = ( 'a' => [qw(a1 a2 a3)], 'b' => [qw(b1 b2 b3)], 'c' => [qw(c1 c2 c3)]); 获得 a1 a2 a3 b1 b2 b3 c1 c2 c3 a1 b1 a1 b2 a1 b3 a1 c1 a1 c2 a1 c3 b1 c1 b1 c2 b1 c3 b2 c1 b2 c2 b2 c3 b3 c1 b3 c2 b3 c3 a1 b1 c1
my %data = (
'a' => [qw(a1 a2 a3)],
'b' => [qw(b1 b2 b3)],
'c' => [qw(c1 c2 c3)]);
获得
a1
a2
a3
b1
b2
b3
c1
c2
c3
a1 b1
a1 b2
a1 b3
a1 c1
a1 c2
a1 c3
b1 c1
b1 c2
b1 c3
b2 c1
b2 c2
b2 c3
b3 c1
b3 c2
b3 c3
a1 b1 c1
a1 b1 c2
a1 b1 c3
a1 b2 c1
a1 b2 c2
a1 b2 c3
a1 b3 c1
a1 b3 c2
a1 b3 c3
a2 b1 c1
a2 b1 c2
a2 b1 c3
a2 b2 c1
a2 b2 c2
a2 b2 c3
a2 b3 c1
a2 b3 c2
a2 b3 c3
a3 b1 c1
a3 b1 c2
a3 b1 c3
a3 b2 c1
a3 b2 c2
a3 b2 c3
a3 b3 c1
a3 b3 c2
a3 b3 c3
谢谢使用brian d foy的模块。您将需要以一种明显的方式将哈希值转换为数组数组
use Set::CrossProduct;
my $iterator = Set::CrossProduct->new( ARRAY_OF_ARRAYS );
my $tuples = $iterator->combinations;
使用brian d foy的模块。您将需要以一种明显的方式将哈希值转换为数组数组
use Set::CrossProduct;
my $iterator = Set::CrossProduct->new( ARRAY_OF_ARRAYS );
my $tuples = $iterator->combinations;
我的模块包含一个笛卡尔函数,可以产生你想要的结果。这段代码似乎做到了这一点,但您的示例并不包含这将产生的所有排列,我假设这只是示例中的一个遗漏
use List::Gen 'cartesian';
my %data = (
'a' => [qw(a1 a2 a3)],
'b' => [qw(b1 b2 b3)],
'c' => [qw(c1 c2 c3)],
);
my $product = cartesian {join ' ' => sort grep defined, @_}
map {[@$_, undef]}
values %data;
say for sort {length $a <=> length $b or $a cmp $b} @$product;
使用列表::Gen'cartesian';
我的%data=(
'a'=>[qw(a1 a2 a3)],
‘b’=>[qw(b1 b2 b3)],
‘c’=>[qw(c1-c2-c3)],
);
my$product=cartesian{join'=>sort grep defined,@}
映射{[@$\uuux,未定义]}
值%数据;
比如说排序{length$a length$b或$a cmp$b}@$产品;
这有点复杂,所以要解释一下:
返回values%data
%data
然后在每个映射的末尾附加一个空值,因为您需要部分组合映射{[@$\uuz,unde]}
然后执行主要工作,计算数组的笛卡尔乘积,同时减去未定义的元素,并对值进行排序,如示例所示cartesian{join'=>sort grep defined,@}
然后按指定顺序打印产品sort{length$a length$b或$a cmp$b}@$product
use List::Gen 'cartesian';
my %data = (
'a' => [qw(a1 a2 a3)],
'b' => [qw(b1 b2 b3)],
'c' => [qw(c1 c2 c3)],
);
my $product = cartesian {join ' ' => sort grep defined, @_}
map {[@$_, undef]}
values %data;
say for sort {length $a <=> length $b or $a cmp $b} @$product;
使用列表::Gen'cartesian';
我的%data=(
'a'=>[qw(a1 a2 a3)],
‘b’=>[qw(b1 b2 b3)],
‘c’=>[qw(c1-c2-c3)],
);
my$product=cartesian{join'=>sort grep defined,@}
映射{[@$\uuux,未定义]}
值%数据;
比如说排序{length$a length$b或$a cmp$b}@$产品;
这有点复杂,所以要解释一下:
返回values%data
%data
然后在每个映射的末尾附加一个空值,因为您需要部分组合映射{[@$\uuz,unde]}
然后执行主要工作,计算数组的笛卡尔乘积,同时减去未定义的元素,并对值进行排序,如示例所示cartesian{join'=>sort grep defined,@}
然后按指定顺序打印产品sort{length$a length$b或$a cmp$b}@$product
@data{qw/ab c/}
会更好。@ysth=>我以前有@data{sort keys%data}
,但我认为这是一个多余的步骤,因为数据稍后会被排序。values%data将以不确定的顺序返回值;我怀疑@data{qw/ab c/}
会更好。@ysth=>我以前有@data{sort keys%data}
,但我认为这是一个多余的步骤,因为数据稍后会被排序。