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

Если бы у нас был один из эти , у нас не было бы этого обсуждения!;-)

, Но серьезно вопросы, которые люди подняли в их ответах, довольно законны. Однако исходный плакат не приводил доводы против предела, просто это, 80 столбцов - лишь немногие.

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

Что касается печати я обычно нахожу, что 100 символьных строк будут очень удобно пригодный на печатную страницу.

24
задан Community 23 May 2017 в 11:46
поделиться

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 такие ошибки невозможны, потому что неиспользование фигурных скобок с управляющими структурами всегда является синтаксической ошибкой. Фактически, стилевое решение было принято на уровне синтаксиса языка.

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

25
ответ дан 28 November 2019 в 22:22
поделиться

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

foreach (@l) do_something unless $condition;

Имеет ли , если $ condition не применяется ко всему объекту или только к do_something ]?

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

18
ответ дан 28 November 2019 в 22:22
поделиться

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

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

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

8
ответ дан 28 November 2019 в 22:22
поделиться

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

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

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

11
ответ дан 28 November 2019 в 22:22
поделиться

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

#!/usr/bin/perl

my $a = 1;

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

# is equivalent to:

print "one\n" if ($a == 1);
6
ответ дан 28 November 2019 в 22:22
поделиться

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

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

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

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

Это было бы ужасающе двусмысленным если фигурные скобки также были необязательными.

6
ответ дан 28 November 2019 в 22:22
поделиться

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

Серьезно, я рад каждой ясности и единообразию кода.

3
ответ дан 28 November 2019 в 22:22
поделиться

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

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

0
ответ дан 28 November 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: