это минимальный рабочий пример того, как пропускать итерации в списке чисел:
#!/usr/bin/env perl
use strict;
use feature 'say';
use warnings FATAL => 'all';
use autodie ':default';
foreach my $n (0..29) {
if ($n % 4 == 0) {
$n += 5; # goes to $n+1, even though I increased $n to $n+5
next;
}
say $n;
}
Я не могу изменить $n
так, чтобы он перескакивал на несколько итераций внутри числа.
То есть я хочу next
переместить вверх на 5, а не на 1.
Как я могу пропустить несколько итераций цикла foreach?
Совет: Обычно не рекомендуется изменять переменную итерации, поскольку она является псевдонимом. Делайте это только в том случае, если вам нужны побочные эффекты.
@ikegami, вы изменили переменную итерации в своем решении, считается ли ваше решение хорошей практикой?
Нет. Хотя в циклах нет переменной итерации, тем более той, которая связана с чем-то. (Циклы for в стиле C на самом деле представляют собой просто циклы while.)
Вместо этого вы используете цикл for в стиле C:
for (my $n = 0; $n <= 29; $n++) {
if ($n % 4 == 0) {
$n += 5;
next;
}
say $n;
}
Это продвигается на 6 вместо 5
Он не сказал, насколько ему хотелось бы, чтобы каждая итерация продвигалась вперед. Он сказал, что хочет, чтобы следующий продвинулся на 5, что и происходит.
Re: «Он не сказал, насколько он хотел, чтобы каждая итерация продвигалась вперед», «Я хочу, чтобы дальше было перемещение на 5 вверх, а не на 1». Вы передвинулись на 5 и 1, а не на 5 вместо 1.
@ikegami Если бы он думал, что может добавить 5 к итератору, то он ожидал бы, что он будет равен 5+1, потому что именно это он и сделал бы с данным кодом. На мой взгляд, его описание расплывчато, но он мог бы скорректировать ответ в соответствии со своими потребностями в течение нескольких секунд после получения решения об использовании цикла for в стиле C, так что я не вижу в этом смысла. Неважно, 5 или 6. Конечно, получить отрицательный голос за правильное решение первым было сюрпризом.
Они ясно сказали, что НЕ хотят увеличиваться на единицу. Ключевым моментом является переход на цикл for в стиле C, но также следует избегать безусловного приращения. Вы прошли только половину пути. Так что нет, ваше решение неверно. И это звучит так, будто ты поспешил быть первым? Даже если это не так, вы утверждаете, что нужно быть более снисходительным, когда есть только одно решение, но это наоборот!
@ikegami Нет, я не тороплюсь с ответами. Если ответ не полный, вношу правки. Здесь это было не нужно. Мой ответ можно оставить как есть. Мой код успешно делает то, что пытался сделать OP, а именно увеличить итератор на 5. В уже увеличивающемся цикле это станет 6. Это тривиально.
Это ты рассказал о времени, которое ты потратил, а не я. И они сказали, что его не следует увеличивать на единицу, но ваш код это делает. Понижающее голосование, которое вас так беспокоит, будет удалено, как только произойдет редактирование, о котором вы заявляете.
@ikegami На простые вопросы быстро приходят конкурирующие ответы, вот как это работает в SO. Не следует голосовать против конкурирующих ответов только для того, чтобы «выиграть» галочку.
Я этого не сделал; Я проголосовал против за неправоту и за то, чтобы способствовать исправлению (именно поэтому я сказал, что удалю отрицательный голос, как только он будет исправлен). Я также оставил комментарий, объясняющий почему (который я повторил несколько раз). Ошибку было легко обнаружить, поскольку я только что избежал ловушки, в которую вы попали, но в остальном отрицательный голос не имел никакого отношения к моему ответу.
Вы можете использовать цикл while. Особенно подходит тот, который имеет форму цикла for в стиле C.
Имейте в виду, что next
выполнит третье предложение «цикла for в стиле C» перед повторной проверкой условия и повторным входом в цикл, поэтому вам нужно будет поместить приращение в тело цикла или использовать $n += 4;
, чтобы избежать приращения на 6. .
for ( my $n = 0; $n <= 29; ) {
if ( $n % 4 == 0 ) {
$n += 5;
next;
}
say $n;
++$n;
}
for ( my $n = 0; $n <= 29; ) {
if ( $n % 4 == 0 ) {
$n += 5;
} else {
say $n;
++$n;
}
}
т. е. foreach
надо смотреть каждую итерацию, спасибо!
@con Нет, for и foreach являются псевдонимами одной и той же функции.
Но вы перебираете список...