Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

foreach (@l) do_something unless $condition;

Используется ли unless $condition для всего объекта или только для инструкции do_something?

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

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

Ответ 6

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

#!/usr/bin/perl

my $a = 1;

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

# is equivalent to:

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

Ответ 7

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

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

Ответ 8

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

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