Ikegami,您的回复包含了多么棒的信息。
我发现你的三个建议太吸引人了,不容忽视,并试图理解它们。您的第一部分是关于处理所描述的数学,转换为十六进制。
我试图将这些步骤结合到“概念测试”脚本中,以及您对模重置的建议。 (好吧,一个“概念理解测试”。)
对于测试脚本,我使用了迭代器而不是搜索触发事件,这似乎更简单。
目标是使值通过示例数组中列出的十六进制数字递增,并在最后一个值。
所以我重复了十次,给价值观一个重新开始的机会。
在我发现每次都需要添加 51 而不是 33 来获得这些示例值之后,并且由于我增加了 51,因此还必须使数组的数值大 51 倍,它工作得很好:
my $num = hex("00");
my @rgbval = qw(a b c d e f);
for my $i (0..10) {
print ( "For i=$i, \$num is " , sprintf("%02x ", $num) , "\n");
$num = ( $num + 51 ) % ( 51 * @rgbval );
}
输出:
~\Perlscripts>iterate2.pl
对于 i=0,$num 是 00
对于 i=1,$num 是 33
对于 i=2,$num 是 66
对于 i=3,
$num 是 99
对于 i=4,$num 是 cc
对于 i=5,$num 是 ff
对于 i=6,$num 是 00
对于 i=7,$num 是 33
对于 i=8,$num 是 66
对于 i=9,$num 是 99
对于 i=10,
$num 是 cc
就非数学方法而言,通过数组的字符串递增,我理解您是说我需要递增引用数组值的索引。我确实设法将我自己与不同的迭代器以及它们在做什么混淆了,但是在几次失误之后,我能够使这种方法也起作用:
my @hue = qw(00 33 66 99 cc ff);
my $v = 0;
for my $i (0..10) {
print "\$i=$i, \$hue[$v]=" , $hue[$v] , "\n";
$v = ( $v + 1 ) % @hue;
}
输出:
~\Perlscripts>iterate2.pl
$i=0, $hue[0]=00
$i=1, $hue[1]=33
$i=2, $hue[2]=66
$i=3,
$hue[3]=99
$i=4, $hue[4]=cc
$i=5, $hue[5]=ff
$i=6,
$hue[0]=00
$i=7, $hue[1]=33
$i=8, $hue[2]=66
$i=9,
$hue[3]=99
$i=10, $hue[4]=cc
您最后提出的解决方案,使用 push 和 shift 旋转数组似乎可能是最新颖的方法并且非常引人注目,尤其是当我意识到如果我有一个存储移位值的变量,那将是下一个 push 的正确值时间,一圈又一圈。
在这种方法中,我什至不必担心在最后一个值之后重新开始;不断变化的数组会自动为我解决这个问题:
my @hue = qw(00 33 66 99 cc ff);
for my $i (0..10) {
my $curval = shift(@hue);
print "\$i=$i, \$curval is $curval \.\.\.And the array is currently: ( @hue )\n";
push(@hue,$curval);
}
输出:
~\Perlscripts>iterate2.pl
$i=0, $curval is 00 ...并且数组当前是:(
33 66 99 cc ff )
$i=1, $curval 是 33 ...而
数组当前为: ( 66 99 cc ff 00 )
$i=2, $curval 为 66 ...而数组当前为: ( 99 cc ff 00 33 )
$i=3, $curval 为
99 ...当前数组为: ( cc ff 00 33 66 )
$i=4, $curval is cc ...并且数组当前是:(
ff 00 33 66 99 )
$i=5, $curval 是 ff ...而
数组当前为: ( 00 33 66 99 cc )
$i=6, $curval 为 00 ...而数组当前为: ( 33 66 99 cc ff )
$i=7, $curval 为
33 ...当前数组为: ( 66 99 cc ff 00 )
$i=8, $curval 是 66 ...而数组当前是:(
99 cc ff 00 33 )
$i=9, $curval 是 99 ...而
数组当前是:( cc ff 00 33 66 )
$i=10, $curval 是 cc ...并且数组当前是:( ff 00 33 66 99 )
最具教育意义和帮助!非常感谢。