我想在Perl中使用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个值(整个运行循环的最低位),但第二次运行失败,因为最后一行的值$start
被重置为0 ...这是一个问题,因为这会打破所有。
所以我想知道的是,我如何保持$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循环可变长度,我不能硬编码每次启动值,所以我在寻找一种方式来最初创建者开始值,然后在循环重置时保留它们。
我意识到这是一个令人困惑的问题,所以请提出问题,我会帮助澄清。
辉煌。我无法正确下载和安装MoreUtils ...我得到了一些关于'undefined symbol:Perl_Istack_sp_ptr'的错误(稍后我会研究它),但是最后一段代码更符合我期待的内容因为 - 我的数组是随机字母,而不是像'a' - 'o'那样。我想如果我能得到它的'一' - 'O',它不会很难适应。非常感谢你的帮助! – incutonez 2012-04-06 11:12:41
实际上,我忽略了你的第一部分代码......这是更优雅的方式。如果我只是在我自己的阵列中进行替换,它可以完美运行。坚实的回答。谢谢。 – incutonez 2012-04-06 11:15:55
刚刚确认MoreUtils也在工作。真的,谢谢。我不认为我可以要求更好的解决方案。 – incutonez 2012-04-06 11:27:43