Почему `my $ x = if (0) {1} else {2}` не работает? - PullRequest
2 голосов
/ 11 февраля 2020

В perl, $x = if (0) {1} else {2} не работает.

$ perl -E'$x = if (0) {1} else {2}'
syntax error at -e line 1, near "= if"
Execution of -e aborted due to compilation errors.

Это имеет смысл, поскольку условные выражения if не являются выражениями в Perl. Они контролируют поток.

Но тогда

my $x = do { if (0) {1} else {2} };

Работает! Почему do BLOCK может принять условное if? Но назначение не может? Казалось бы, в приведенном выше примере управление потоком должно либо

  • знать, что его контекст в do BLOCK
  • всегда действует как выражение, но этот синтаксис запрещен синтаксическим анализатором.

Кроме того, учитывая простые факты, приведенные выше, как правильно описать условие if, которое ведет себя так? Это выражение со значением? Является ли это конструкцией управления потоком, которая не имеет значения после оценки?

И, наконец, какие изменения необходимо внести в присвоение, чтобы оно приняло условие if, например do BLOCK.

1 Ответ

0 голосов
/ 11 февраля 2020

Единственный ответ и комментарий, который касается вопроса в вопросе, который вносит ясность, - это Ginnz,

Общий дизайн состоит в том, что perl имеет ключевые слова, которые имеют смысл только в определенных контекстах, и if является одним из них - это может быть только начало оператора или модификатора оператора, и ни один из них не действует непосредственно после =. Это различие синтаксического анализатора в первую очередь. Кроме того, рассмотрение вопроса "что возвращает оператор if" не всегда интуитивно понятно, так что пока вы можете это выяснить, поместив его в блок do или последнее утверждение подпрограммы, это не то, что следует поощрять к использованию в качестве значения. На самом деле это обычно приводит к ошибкам . - Гриннц 11 часов go

Когда Гиннц говорит о различении синтаксического анализатора, я интерпретирую это как означающее, что для ясности это не стоит делать. То, что действительно после =, просто не является оператором if, и для этого нет реальной причины, за исключением того, что это так.

  • if Условный оператор.
  • возвращаемые значения оператора.
  • присваивание = прямо запрещает операторы справа, потому что он принимает только вещи в классе выражений.
  • a do BLOCK может превратить оператор в выражение.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...