NestedLoops関数を使用してPerlで順列プログラムを構築しようとしています。これが私のコードです:
use strict;
use warnings;
use Algorithm::Loops qw(NestedLoops);
my @a = 'a'..'o';
my $length = 5;
my $start = 0;
my $depth = 2;
NestedLoops([
[0..$length],
( sub {
$start = 0 if $start == $depth;
$start++;
[$start * $length..$start * $length + $length - 1]
}) x $depth,
], \&permute,);
sub permute {
my @ind = @_;
foreach my $i (@ind) {
print $a[$i];
}
print "\n";
}
したがって、文字「a」から「o」(サイズは15)を保持する配列があります。配列を3行あるかのように扱っているので、配列の想像力は次のようになります。
abcde
fghij
klmno
次に、各ループは各行に対応します...そして私は次のような順列を構築したいと思います:
afk
afl
afm
afn
afo
agk // fails here... I end up getting agg
...
最初の5つの値(最も低いforループの実行全体)で機能しますが、最後の行の値が$start
0にリセットされるため、2番目の実行は失敗します...これはすべてを壊すため問題です。
ですから、私が知りたいのは$start
、レベルに基づいて永続性の値を維持するにはどうすればよいかということです...つまり、私が求めているのは、本質的に定数を持つことです。私のループは実際には次のようになります。
for my $a (0..5) { # 0 at this level and never change
for my $b (5..10) { # $start should be 5 at this level and never change
for my $c (10..15) { # $start should be 10 at this level and never change
permute($a, $b, $c);
}
}
}
ここで、forループの長さが可変になるため、各開始値をハードコーディングできないため、最初にそれらの開始値を作成し、ループがリセットされたときにそれらを保持する方法を探しています。
これは紛らわしい質問だと思いますので、質問してください。明確にするのを手伝います。