Почему операторы управления Perl требуют фигурных скобок?

Это может выглядеть как недавний вопрос, который спросил почему Perl не позволяет "разблокировать" однострочные, но я нашел ответы на этот вопрос неудовлетворительными, потому что они либо ссылались на синтаксическая документация, которая говорит, что фигурные скобки необходимы, который, я думаю, просто напрашивается на вопрос, или проигнорировал вопрос и просто дал braceless альтернативы.

Почему Perl требует фигурных скобок для операторов управления, таких как если и на? Другими словами, почему Perl требует блоков, а не операторов, как позволяют некоторые другие популярные языки?

8 ответов


одной из причин может быть то, что некоторые стили диктуют, что вы всегда должны использовать фигурные скобки со структурами Управления, даже для одного лайнера, чтобы избежать их разрыва позже, например:

if (condition) 
   myObject.doSomething();
else 
   myObject.doSomethingElse();

затем кто-то добавляет что-то еще к первой части:

if (condition)
   myObject.doSomething();
   myObject.doSomethingMore(); // Syntax error next line
else 
   myObject.doSomethingElse();

или еще хуже:

if (condition)
   myObject.doSomething();
else 
   myObject.doSomethingElse();
   myObject.doSomethingMore(); // Compiles, but not what you wanted.

в Perl такие ошибки невозможны, потому что не использовать фигурные скобки со структурами управления всегда синтаксическая ошибка. По сути, решение стиля применяется на уровне синтаксиса языка.

является ли это какой-либо частью реальные причина, только усы Ларри знает.


одной из причин может быть то, что некоторые конструкции могут быть неоднозначными без скобки :

foreach (@l) do_something unless $condition;

тут unless $condition применить ко всему или просто do_something заявление?

конечно, это могло быть разработано с правилами приоритета или что-то в этом роде, но это был бы еще один способ создать запутанный код Perl: -)


одна проблема с braceless if-else предложения они могут привести к синтаксической двусмысленности:

if (foo)
    if (bar)
       mumble;
    else
       tumble;

Учитывая вышеизложенное, при каком условии выполняется падение? Это можно интерпретировать как происходящее, когда !foo или foo && !bar. Добавление фигурных скобок очищает двусмысленность, не загрязняя источник слишком много. Затем вы можете сказать, что всегда хорошо иметь фигурные скобки, поэтому давайте сделаем язык требуемым и решим бесконечные споры о том, должны ли они быть используется или нет. Или, Конечно, вы можете решить проблему, полностью избавившись от фигурных скобок и используя отступ для указания вложенности. Оба способа сделать ясный, недвусмысленный код естественным, а не требующим особых усилий.


в программировании Perl (соавтором которого был Ларри Уолл), 3-е издание, стр. 113, составные операторы определяются в терминах выражений и блоков, а не операторов, а блоки имеют фигурные скобки.

обратите внимание, что в отличие от C и Java, [составные операторы] определяются в условия блоки, а не утверждения. Это значит что расчалки requried-никаких болтающихся заявлений допустимый.

Я не знаю, отвечает ли это на ваш вопрос, но это похоже, в этом случае он предпочел простую языковую структуру вместо того, чтобы делать исключения.


возможно, не имеет прямого отношения к вашему вопросу о (предположительно) Perl 5 и ранее, но...

в Perl 6 структуры управления не требуют скобок:

if $x { say '$x is true' }

for <foo bar baz> -> $s { say "[$s]" }

Это было бы ужасно неоднозначно, если бы скобки также были необязательными.


разве Perl не позволяет пропустить фигурные скобки, но тогда вам нужно написать оператор до состоянии? т. е.

#!/usr/bin/perl

my $a = 1;

if ($a == 1) {
    print "one\n";
}

# is equivalent to:

print "one\n" if ($a == 1);

"хорошо, поэтому обычно вам нужны фигурные скобки вокруг блоков, но не если блок имеет длину только одного оператора, за исключением, конечно, если ваш оператор будет неоднозначным образом, который будет управляться правилами приоритета не так, как вы хотите, если вы опустите фигурные скобки-в этом случае вы также можете представить использование круглых скобок, но это будет непоследовательно, потому что это блок в конце концов-это, конечно, зависит от соответствующего приоритета участвующих операторов. В любом случае, вам не нужно ставить точки с запятой после закрытия фигурных скобок - это даже неправильно, если вы заканчиваете оператор if, за которым следует оператор else, за исключением того, что вы абсолютно должны поставить точку с запятой в конце файла заголовка в C++ (или это был C?)."

серьезно, я рад за каждую эксплицитность и единообразие в коде.


просто угадать здесь, но" разблокированные " петли / ifs / etc. как правило, это места, где тонкие ошибки вводятся во время обслуживания кода, так как небрежный сопровождающий может попытаться добавить еще одну строку "внутри цикла", не понимая, что это не действительно внутри.

конечно, мы говорим о Perl, поэтому, вероятно, любой аргумент, основанный на ремонтопригодности, является подозрительным... :)