Почему я не продолжаю выполнять следующий блок блока Perl 5.10? - PullRequest
2 голосов
/ 29 марта 2010

Когда я запускаю это:

use feature ':5.10';
$x=1;
given ($x) {
    when(1) {
        say '1';
        $x = 2;
        continue;
    }
    when (2) {
        say '2';
    }
}

Это должно печатать как 1, так и 2, но печатает только 1. Я что-то упустил?

EDIT:

Я добавил $ x = 2, и он по-прежнему печатает только «1»

Ответы [ 3 ]

9 голосов
/ 29 марта 2010

См. Справочную страницу perlsyn :

данный (EXPR) присвоит значение EXPR $ _ в лексической области блока

Этот код выводит 1 и 2:

use feature ':5.10';
$x=1;
given ($x) {
    when(1) {
        say '1';
        $_ = 2;
        continue;
    }
    when (2) {
        say '2';
    }
}
4 голосов
/ 29 марта 2010

Я думаю, что вы, возможно, неправильно понимаете цель continue или природу падения в конструкции переключателя.

Каждый when блок заканчивается неявным разрывом, поэтому given завершается при успешном совпадении. Все, что continue делает, это говорит блоку given продолжить обработку условий when и не прерывать их. Это не заставляет следующее when условие волшебным образом быть истинным, когда оно не выполняется.

Учтите, что выводит дважды.

use feature ':5.10';
$x=1;
given ($x) {
    when(1) {
        say '1';
        continue;
    }
    when ( /1/ ) {
        say '1 again';
    }
}
0 голосов
/ 30 марта 2010

Так как данный не является циклической конструкцией (несмотря на то, что она поддерживает продолжение, которое в этом случае имеет особый случай), используйте foreach или подобное:

use feature ':5.10';
$x=1;
for ($x) {
    when(1) {
        say '1';
        $x = 2;
        continue;
    }
    when (2) {
        say '2';
    }
}

for (выражение) устанавливает $ _ в выражение, и это поведение использовалось для эмуляции switch в некоторых случаях перед заданным / когда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...