Получить поведение переключателя/случая в Perl 5
Есть ли простой способ сделать оператор или оператор switch в Perl 5?. Мне кажется, они должны включить переключатель на версию 6.
Мне нужна эта структура управления в script, и я слышал, что вы можете импортировать "модуль коммутатора". Но как я могу достичь этого без импорта, чтобы свести к минимуму зависимости и приобрести переносимость?
Ответы
Ответ 1
Если вы используете Perl 5.10, у вас есть given
/when
, который является оператором switch (обратите внимание, что он может делать больше, чем сравните с регулярными выражениями, прочитайте связанные документы, чтобы увидеть его полный потенциал):
#or any of the dozen other ways to tell 5.10 to use its new features
use feature qw/switch/;
given($string) {
when (/^abc/) { $abc = 1; }
when (/^def/) { $def = 1; }
when (/^xyz/) { $xyz = 1; }
default { $nothing = 1; }
}
Если вы используете Perl 5.8 или более раннюю версию, вы должны делать с операторами if
/elsif
/else
:
if ($string =~ /^abc/) { $abc = 1; }
elsif ($string =~ /^def/) { $def = 1; }
elsif ($string =~ /^zyz/) { $xyz = 1; }
else { $nothing = 1; }
или вложенные операторы условий (?:
):
$string =~ /^abc/ ? $abc = 1 :
$string =~ /^def/ ? $def = 1 :
$string =~ /^xyz/ ? $xyz = 1 :
$nothing = 1;
В Core Perl есть модуль (Switch), который дает вам фальшивые инструкции switch через исходные фильтры, но я понимаю, что хрупкий:
use Switch;
switch ($string) {
case /^abc/ {
case /^abc/ { $abc = 1 }
case /^def/ { $def = 1 }
case /^xyz/ { $xyz = 1 }
else { $nothing = 1 }
}
или альтернативный синтаксис
use Switch 'Perl6';
given ($string) {
when /^abc/ { $abc = 1; }
when /^def/ { $def = 1; }
when /^xyz/ { $xyz = 1; }
default { $nothing = 1; }
}
Ответ 2
Предложение по программированию Perl:
for ($string) {
/abc/ and do {$abc = 1; last;};
/def/ and do {$def = 1; last;};
/xyz/ and do {$xyz = 1; last;};
$nothing = 1;
}
Ответ 3
Просто короткий комментарий о базовом модуле Switch, который несколько раз упоминался в ответах. В рассматриваемом модуле используются исходные фильтры. Среди прочего, это может привести к неверным строкам, сообщаемым об ошибках. Это так плохо, что ни один из основных разработчиков не помнит или не заботится о том, чтобы понять, почему он был принят в перл-ядро в первую очередь.
Кроме того, Switch.pm будет первым модулем Perl, который когда-либо будет удален из ядра perl. Следующий крупный выпуск perl, 5.12.0, по-прежнему будет иметь его, хотя и с предупреждением об устаревании. Это предупреждение об утомлении исчезнет, если вы явно установите Switch.pm из CPAN. (Вы получаете то, о чем просите.) В следующем выпуске по дороге 5.14 Switch.pm будет полностью удален из ядра.
Ответ 4
Эквивалентное решение, которое мне нравится, это таблица рассылки.
my $switch = {
'case1' => sub { print "case1"; },
'case2' => sub { print "case2"; },
'default' => sub { print "unrecognized"; }
};
$switch->{$case} ? $switch->{$case}->() : $switch->{'default'}->();
Ответ 5
print("OK : 1 - CANCEL : 2\n");
my $value = <STDIN>;
SWITCH: {
($value == 1) && last(SWITCH);
($value == 2) && do {print("Cancelled\n"); exit()};
print("??\n");
}