Эквиваленты возврата, продолжения, разрыва
return
- эквивалент возврата. next
- эквивалент продолжения. last
является эквивалентом break.
'if' после операторов следуют блоки
Ваша проблема в том, что за оператором if
всегда следует блок внутри фигурных скобок.
if ($_ == $a) { return TRUE; }
elsif (...) { ... }
else { ... }
Для всех это иногда кажется немного многословным, я согласен с ysth , что это то, что Perl понял правильно.Интересный альтернативный вариант: см. Язык программирования Go , который рассматривает скобки как ненужные и обязывает использовать скобки.
'if' может использоваться в качестве квалификатора
Или вы можете использовать if
в качестве модификатора оператора:
return TRUE if $_ == $a;
Обратите внимание, что в этом случае вам не нужно использовать скобки вокруг условного выражения, хотя добавление не повредитих.
Использование 'кроме'
Вы также можете использовать unless
вместо if
для инвертирования условия:
return TRUE unless $_ != $a;
(И, как Филипп Поттер указал, что смешивание unless
с отрицательным условием усложняет понимание; пример непосредственно делает то же самое, что и вопрос, но лучше написать как if
с равенством.)
Используя 'next' и 'last'
Вы можете использовать next
и last
аналогично:
sub search {
my ($a, @a_list) = @_;
foreach (@a_list) {
return TRUE if $_ == $a;
last if $_ > $a;
next if $ptom != LAST_QUARTER;
...
}
return FALSE;
}
Обратите внимание на исправление в цикле foreach
. ( Вопрос дополнен исправлением. ) Убедитесь, что у вас всегда есть 'use strict;
'и' use warnings;
'вверху вашего скрипта.Эксперты всегда используют их, чтобы убедиться, что они не допустили ошибок.Начинающие должны использовать их по одной и той же причине.
TRUE и FALSE
Кроме того, как указано в других ответах, Perl не имеет предварительно определенных констант TRUE и FALSE, больше, чемC или C ++ do (C ++ имеет встроенные true
и false
; C99 имеет true
и false
, условно доступных, если вы #include <stdbool.h>
).Вы можете предоставить определения для Perl как:
use constant TRUE => 1;
use constant FALSE => 0;
Будьте осторожны.Некоторые вещи будут «истинными», даже если они не равны TRUE;другие вещи будут 'ложными', даже если они не равны FALSE.
Обсуждение использования '$ a' и '$ b'
Комментарии содержат обсуждение отказа от использования$a
и $b
как переменные.Последовательно соответствующие комментарии были:
Пожалуйста, избегайте использования $ a, если оно не находится в блоке сортировки.- Zaid
@ Zaid: Хорошо, что $ a и $ b являются особенными в контексте блока сортировки.Я не уверен, есть ли указы, которые они никогда не должны использовать иначе - было бы ужасно использовать их, когда вокруг скрывается также блок сортировки, но в отсутствие блоков сортировки я не вижу никакой причиныобрабатывать $ a и отличаться от $ z.- Джонатан Леффлер
$ a и $ b являются глобальными и, следовательно, ведут себя иначе, чем лексические выражения.- phaylon
@ phaylon: ну, строго говоря, они являются «глобальными пакетами» (см. Perl sort ).Да, когда вы сортируете, они отличаются от лексических (моих) переменных.Если вы не выполняете сортировку, они могут рассматриваться как лексические, если вы объявите их явно.- Джонатан Леффлер
@ Джонатан Леффлер, они также освобождены от использования строгих qw (переменные);так что вы можете не заметить, что вы попираете их из другой сферы.- Ven'Tatsu
Указывая на очевидное: я использовал $a
только потому, что вопрос - и вместо того, чтобы затопить оригинальный плакат с большим количеством деталейЯ придерживался в основном основных моментов.Например, при обсуждении last
и next
не упоминаются метки петель.
Тем не менее, совет "избегать использования $a
и $b
в качестве переменных" является обоснованным;они являются специальными именами по указанным причинам, и их использование оставляет возможность ошибок, которые могут быть или не быть обнаружимы.