[ Обратите внимание, что функция 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 = "";
}
}