Как перейти к определенной точке итерации foreach?

это минимальный рабочий пример того, как пропускать итерации в списке чисел:

#!/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 09.07.2024 01:16

Совет: Обычно не рекомендуется изменять переменную итерации, поскольку она является псевдонимом. Делайте это только в том случае, если вам нужны побочные эффекты.

ikegami 09.07.2024 04:15

@ikegami, вы изменили переменную итерации в своем решении, считается ли ваше решение хорошей практикой?

con 09.07.2024 04:19

Нет. Хотя в циклах нет переменной итерации, тем более той, которая связана с чем-то. (Циклы for в стиле C на самом деле представляют собой просто циклы while.)

ikegami 09.07.2024 04:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
119
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вместо этого вы используете цикл for в стиле C:

for (my $n = 0; $n <= 29; $n++) {
    if ($n % 4 == 0) {
        $n += 5; 
        next;
    }
    say $n;
}

Это продвигается на 6 вместо 5

ikegami 09.07.2024 01:18

Он не сказал, насколько ему хотелось бы, чтобы каждая итерация продвигалась вперед. Он сказал, что хочет, чтобы следующий продвинулся на 5, что и происходит.

TLP 09.07.2024 01:21

Re: «Он не сказал, насколько он хотел, чтобы каждая итерация продвигалась вперед», «Я хочу, чтобы дальше было перемещение на 5 вверх, а не на 1». Вы передвинулись на 5 и 1, а не на 5 вместо 1.

ikegami 09.07.2024 01:48

@ikegami Если бы он думал, что может добавить 5 к итератору, то он ожидал бы, что он будет равен 5+1, потому что именно это он и сделал бы с данным кодом. На мой взгляд, его описание расплывчато, но он мог бы скорректировать ответ в соответствии со своими потребностями в течение нескольких секунд после получения решения об использовании цикла for в стиле C, так что я не вижу в этом смысла. Неважно, 5 или 6. Конечно, получить отрицательный голос за правильное решение первым было сюрпризом.

TLP 09.07.2024 02:09

Они ясно сказали, что НЕ хотят увеличиваться на единицу. Ключевым моментом является переход на цикл for в стиле C, но также следует избегать безусловного приращения. Вы прошли только половину пути. Так что нет, ваше решение неверно. И это звучит так, будто ты поспешил быть первым? Даже если это не так, вы утверждаете, что нужно быть более снисходительным, когда есть только одно решение, но это наоборот!

ikegami 09.07.2024 04:10

@ikegami Нет, я не тороплюсь с ответами. Если ответ не полный, вношу правки. Здесь это было не нужно. Мой ответ можно оставить как есть. Мой код успешно делает то, что пытался сделать OP, а именно увеличить итератор на 5. В уже увеличивающемся цикле это станет 6. Это тривиально.

TLP 09.07.2024 12:30

Это ты рассказал о времени, которое ты потратил, а не я. И они сказали, что его не следует увеличивать на единицу, но ваш код это делает. Понижающее голосование, которое вас так беспокоит, будет удалено, как только произойдет редактирование, о котором вы заявляете.

ikegami 09.07.2024 14:57

@ikegami На простые вопросы быстро приходят конкурирующие ответы, вот как это работает в SO. Не следует голосовать против конкурирующих ответов только для того, чтобы «выиграть» галочку.

TLP 09.07.2024 15:46

Я этого не сделал; Я проголосовал против за неправоту и за то, чтобы способствовать исправлению (именно поэтому я сказал, что удалю отрицательный голос, как только он будет исправлен). Я также оставил комментарий, объясняющий почему (который я повторил несколько раз). Ошибку было легко обнаружить, поскольку я только что избежал ловушки, в которую вы попали, но в остальном отрицательный голос не имел никакого отношения к моему ответу.

ikegami 09.07.2024 15:57
Ответ принят как подходящий

Вы можете использовать цикл 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 09.07.2024 01:27

@con Нет, for и foreach являются псевдонимами одной и той же функции.

TLP 09.07.2024 01:28

Другие вопросы по теме