Указание «когда продолжить» в perl - PullRequest
2 голосов
/ 21 апреля 2020

Я учился Perl у www.perltutorial.org. Там я узнал, что given-when похоже на switch-case. Поэтому на практике я написал следующий сценарий. Теперь, когда я узнал, что break присущ given-when, чтобы сделать провал, мне нужно использовать выражение continue.

Когда я даю "сладкий" ввод, он выводит как "Как делают реальные люди". Не следует выводить как

"Honey just put your sweet lips on my lips\n
We should just kiss like real people do" 

Вот код:

#!/usr/bin/perl
use strict;
use warnings;
use feature "switch";
my $choice = <STDIN>;
my $msg ="";
chomp($choice);
given(lc $choice){
    when('a'){
        $msg = "I had a thought, dear";
    }
    when('b'){
        $msg = "However scary";
    }
    when('c'){
        $msg = "About that night";
    }
    when('d'){
        $msg = "The bugs and the dirt";
    }
    when('e'){
        $msg = "Why were you digging?";
    }
    when('sweet'){
        $msg =  "Honey just put your sweet lips on my lips ";
        continue;
    }
    when('lips'){
        $msg = $msg."\nWe should just kiss like real people do";
    }
    default{
        $msg = "";
    }
}

#print($msg,"\n");
unless($msg eq "") {
    print($msg, "\n");
}else{
    print("Like real People do!\n");
}

1 Ответ

6 голосов
/ 22 апреля 2020

[ Обратите внимание, что функция smartmatching экспериментальная , и считается, что она имеет неправильный дизайн. Расширение, так же, как и функция переключения, потому что она использует smartmatching. Этого следует избегать. ]

На самом деле, $msg содержит пустую строку.

#!/usr/bin/perl
use strict;
use warnings;
use feature qw( say switch );
my $choice = "sweet\n";
chomp($choice);
my $msg ="";
given(lc $choice){
    # ...
    when('e'){
        $msg = "Why were you digging?";
    }
    when('sweet'){
        $msg = "Honey just put your sweet lips on my lips\n";
        continue;
    }
    when('lips'){
        $msg .= "We should just kiss like real people do";
    }
    default{
        $msg = "";
    }
}

say ">$msg<";

Вывод:

given is experimental at a.pl line 8.
when is experimental at a.pl line 10.
when is experimental at a.pl line 14.
when is experimental at a.pl line 17.
><

continue вызывает выполнение перейти к утверждению после оператора when. Следующим оператором является when('lips'){ ... }, который ничего не делает (поскольку "sweet" ~~ "lips" является ложным). После этого оператор default { $msg = ""; } очищает $msg, поскольку when не было выполнено с тех пор, как мы продолжили.

Чтобы получить желаемый результат, вам потребуется следующее:

given(lc $choice){
    # ...
    when('e'){
        $msg = "Why were you digging?";
    }
    when('sweet'){
        $msg = "Honey just put your sweet lips on my lips\n";
        continue;
    }
    when($_ ~~ 'sweet' || $_ ~~ 'lips'){
        $msg .= "We should just kiss like real people do";
    }
    default{
        $msg = "";
    }
}

Без экспериментального переключателя и функций smartmatching мы могли бы использовать

for (lc $choice) {
    # ...
    if ($_ eq 'e'){
        $msg = "Why were you digging?";
        last;
    }
    if ($_ eq 'sweet'){
        $msg = "Honey just put your sweet lips on my lips\n";
        last;
    }
    if ($_ eq 'sweet' || $_ eq 'lips'){
        $msg .= "We should just kiss like real people do";
        last;
    }
    $msg = "";
}

или

for (lc $choice) {
    # ...
    if ($_ eq 'e'){
        $msg = "Why were you digging?";
    }
    elsif ($_ eq 'sweet' || $_ eq 'lips'){
        if ($_ eq 'sweet'){
            $msg = "Honey just put your sweet lips on my lips\n";
        }

        $msg .= "We should just kiss like real people do";
    }
    else {
        $msg = "";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...