операторы в стеке Perl - PullRequest
3 голосов
/ 19 июля 2011

В php я могу составлять операторы case, могу ли я сделать эквивалент с perl?

        switch($myValue)             
        {            
            case "one":
            case "two":
            break;
            case "three":
            break;
            default:
            break;
         }

Ответы [ 5 ]

14 голосов
/ 19 июля 2011

Операторы переключения в Perl > = 5.10 реализованы с использованием конструкций given и when. Он очень гибкий благодаря умному сопоставлению значения, переданного given.

use feature qw( switch );
use strict;
use warnings;

given ($value) {
    when ( [qw/one two/] ) {
        # do something
    }
    when ('three') {
        # do some other thing
    }
    default {
        # default to something
    }
}

Вы могли бы даже написать when ( [qw/one two/] ) как when ( /one|two/ ).

5 голосов
/ 19 июля 2011

В Perl это будет:

use 5.010;
given( $myValue )             
{            
    when ( [qw<one two>] ) { say; }
    when ( "three" )       { say "I'm $_";  }
    default                { say qq{DEFAULT for "$_"};  }
 }

И чтобы проверить это:

use 5.010;

foreach my $myValue ( qw<one two three four> ) 
{
    given( $myValue )             
    {            
        when ( [qw<one two>] ) { say; }
        when ( "three" )       { say "I'm $_";  }
        default                { say qq{DEFAULT for "$_"};  }
     }
}

И он печатает:

one
two
I'm three
DEFAULT for "four"

Perlдопускает другой тип провала с оператором continue.Но критерии обоих случаев должны быть удовлетворены.Таким образом:

given( $myValue )
{
    when ( 'one' ) { say 'one!'; continue; }
    when ( 'two' ) { say 'two!'; }
}

не имеет смысла, потому что это никогда не будет случаем, когда $s ~~ 'one' && $s ~~ 'two', но если вы сделали второй случай:

    when ( /\bo|o\b/ ) { say q/has 'o'!/; }

условие проваласпособен быть правдой.Одно предостережение: поскольку все соответствует default, если у вас есть default кейс, продолжение продолжит его, если ничего больше.continue, кажется, говорит: «Хорошо, теперь посмотрим, к чему применимы другие предикаты».

Я упоминаю об этом просто потому, что это обманчиво похоже на «своего рода провальный оператор», но это действительно «взгляд снова».Оператор.

4 голосов
/ 19 июля 2011

В Perl <5.10 вы можете подделать его с подрефами в хэше: </p>

my %switch = (
    foo => sub { do_something() },
    bar => sub { do_something_else() },
);
exists $switch{$check_var} ? $switch{$check_var}->() : do_the_default_case();

Это не даст вам провал (без устройства Даффа), хотя это сомнительная особенность.

1 голос
/ 20 июля 2011

Если вам нужно , чтобы провалиться, есть оператор continue, который позволяет вам сделать это явно

given($foo) {
  when (/x/) { say '$foo contains an x'; continue }
  when (/y/) { say '$foo contains a y' }
  default    { say '$foo does not contain a y' }
}

, а не неявно (например, опуская оператор break в примере OP).

Образец взят из perlsyn .

0 голосов
/ 29 июля 2011

У меня работает следующее:

use Switch;

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