Вы можете просто получить список признаков, используя оператор диапазона (..
), вычитая верхнее окно из $i
и добавляя нижнее окно к $i
.Вам нужно будет не пропускать итератор, когда итератор равен $i
, если вы не хотите, чтобы $i
th значение.
Вам нужно будет использовать оператор по модулю (%
)держать индекс в границах массива.Учитывая массив размером 11
, мы можем видеть, что, изменяя индекс с помощью 11
, он всегда будет указывать на правильное место в массиве:
#!/usr/bin/perl
use strict;
use warnings;
for my $i (-22 .. 22) {
print "$i => ", $i % 11, "\n";
}
Вы можете столкнуться с проблемами с огромными числами(т. е. числа, которые больше, чем у вашей платформы, в целом числе без знака), потому что Perl 5 меняет алгоритм, используемый там модулем.Это больше похоже на C fmod
(но есть некоторые различия).
Вы также можете не использовать прагму integer
.Это делает %
быстрее, но вы получаете поведение оператора C по модулю.Ни ANSI, ни ISO не определяют, что C должен делать с отрицательными числами, поэтому вы можете или не можете получить действительный индекс.Конечно, до тех пор, пока версия C имеет плюсы
X -5 -4 -3 -2 -1 0 1
X%5 0 -4 -3 -2 -1 0 1
или
X -5 -4 -3 -2 -1 0 1
X%5 0 1 2 3 4 0 1
, все должно быть хорошо (если не очень переносимо).
Похоже, C99 определяет оператор по модулю для возврата второго регистра, при условии, что perl
компилируется с помощью компилятора C99 (с включенным флагом C99), это должно быть безопасноиспользуйте integer
прагму.