メインルーチン
our @names; #配列番号→配列名 頻繁に使うのでourかなあ? our $bit_length; #配列数より大きい数であればなんでもいい。ビット数を数えるときに使う。 our %bit; #要素 => 要素を含む配列を1, 含まない配列を0としてビット列にして1つにまとめたもの #$bit{'3'} = 101なら、最初の配列と3つめの配列だけ'3'を要素としてもっている。 #これが処理の核となるデータ。 { my %h; %h = &data_hush(@data); #生データからいきなり%bitを生成するのはしんどいので、ハッシュを経る %bit = &hash_bit(%h); #一番重要な%bitを得る #核となる再帰ルーチンに渡す初期状態を作り上げる my @key = sort {$a cmp $b} keys %bit; #いちいちkeysを使ってると日が暮れるので作ってしまう my $all_1 = $bit{$key[0]} | ~$bit{$key[0]}; #どの要素も列挙する可能性があるところからスタート $bit_length = 8 * length $all_1; #フラグの個数を下回らない、かつバイトの整数倍となるビットの個数 &recursive_exist($all_1, [], \@key); #全てのデータと初期条件はそろったのであとは再起ルーチンに任せるだけ }