LINUX.ORG.RU

perl switch case

 


0

1

хотелось бы чтобы следующий код выводил: 123

по факту выводит только: 1

т.е. как полагаю, внутри самого switch-а условие $stage нельзя поменять в одном из case без перехода к началу? Или это как-то можно обойти?

#!/usr/bin/perl -w
use strict;
use warnings;
use Switch;
my $stage="1";

    switch ($stage) {
                
            case 1 {
                    print "1";
                    $stage++;
                    next;
                    }
              
            case 2 {
                 print "2";
                   $stage++;
                   next;
                   }

            case 3 {
                    print "3";
                    $stage++;
                    next;
                   }
            }

Во первых, в перле не свича. Во вторых, классическая табличная реализация такого делать не позволяет. В третьих, используй внешних блок с меткой, и прыгай выше

BLOCK_A: {
  switch {
     ...........
     next BLOCK_A;
     ...........
  }
}
zdesnesru
()
Ответ на: комментарий от bvn13

в данном коде «next» перебрасывает к следующему «case» без него на первом же «case» управление передается на конец без проверки остальных.

karasic
() автор топика

Читать доку умеем?

      switch ($val) {
                    case 1      { handle_num_1(); next }    # and try next case...
                    case "1"    { handle_str_1(); next }    # and try next case...
                    case [0..9] { handle_num_any(); }       # and we're done
                    case /\d/   { handle_dig_any(); next }  # and try next case...
                    case /.*/   { handle_str_any(); next }  # and try next case...
            }

Ключевое слово в камментах «try». То есть это грубо говоря эквивалетно коду:

if ($a) {
}
if ($b) { # здесь условие не выполняется и код не отрабатывает.
}
DELIRIUM ☆☆☆☆☆
()

perldoc perlsyn > given/when

anonymous
()

Не используйте Switch. У него в документации больше одного раза написано: do not use, use given/when instead.

Используйте:

no warnings experimental::smartmatch;
use feature 'switch'.

anonymous
()
Ответ на: комментарий от anonymous

use Switch;

Да, уже давно deprecated

https://perldoc.perl.org/perlsyn.html#Switch-Statements

no warnings experimental::smartmatch;

Вот это печалька. Smartmatch — классная штука, жаль местами глюковатая (по дизайну).

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)

Switch::Plain лучше возьми, он не использует сорс фильтр

annulen ★★★★★
()
Ответ на: комментарий от KennyMinigun

given хорош тем, что возвращает значение.

Но если вдруг боитесь given'а, можно установить контекст обычным for'ом:

for ($var) {
  say 'this is a number' when /^\d+$/;
  say 'this is a world' when /^\w+$/;
  default { say 'tell me please, what is it?' }
}  
DRVTiny ★★★★★
()
Ответ на: комментарий от DRVTiny

given хорош тем, что возвращает значение.

Как это ты из него значение возвращаешь? Знаю только одну жопу, через которую можно выдрать подобные гландды:

Instead of using «given()», you can use a «foreach()» loop.
...
Perceptive Perl hackers may have noticed that a «for» loop has a return value, and that this value can be captured by wrapping the loop in a «do» block. The reward for this discovery is this cautionary advice: The return value of a «for» loop is unspecified and may change without notice. Do not rely on it.

Чувствую себя чернокнижником, когда вещаю про подобное безумие

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.