Как написать это в идиоматическом awk? - PullRequest
0 голосов
/ 20 августа 2011

Следующая программа выводит имя файла, количество строк и количество строк, которые начинаются с // в случае, если более одной пятой строк начинается таким образом.

awk '$1 == "//" { a+=1 } END { if (a * 5 >= NR) {print FILENAME " " NR " " a}}' MyClass.java

Это работает, но вложенная {{}} заставляет меня задаться вопросом, правильно ли я делаю, зная, что типичная структура awk-программы:

awk 'condition { actions }'

Так что я подозреваю, что-то вроде

awk '$1 == "//" { a+=1 } END  && (a * 5 >= NR) {print FILENAME " " NR " " a}' MyClass.java

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

1 Ответ

2 голосов
/ 20 августа 2011

Есть и другие способы выразить это, но вы написали это идиоматически в первый раз.Хотя авторы склонны опускать фигурные скобки всякий раз, когда они могут, вы все равно можете найти примеры такого кода на всем протяжении Язык программирования AWK .Они должны знать.

Похоже, что Ахо, Вайнбергер и Керниган имеют опыт многовекового развития языков, синтаксис которых происходит от C. И когда они пишут что-то вроде этого

if (a * 5 >= NR) 
    print FILENAME " " NR " " a

прекрасно сообщает, что блок, следующий за оператором if, должен содержать один и только один оператор.

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

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

if () {}

Затем я возвращаюсь и заполняю его, ломая строки, если мне нужно,В моем обычном редакторе «if» автоматически расширяется до «if () {}».Я почти уверен, что ни разу не опускал фигурные скобки с середины 1980-х годов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...