ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
4 мая
1047990 Топик полностью
fk0, легенда (29.10.2020 23:27, просмотров: 537) ответил lloyd на Познакомился с Tcl/Expect. Это офигенно, давно я не испытывал такого экстаза от автоматизации. Почти весь тот монстр, что у меня запускался на pytest/labgrid полминуты, поместился в 400 строк кода с авторизацией по паролям, переходом между пингвином и загрузчиком (в обе стороны), выполнение команд с захватом результата. Да, мб Tcl работает медленно, зато не медленно запускается, а бОльшая часть простоев в моих операциях - запись флешки или тест IO, переход между этапами не
Вообще такую автоматизацию можно часто делать на awk. Его совершенно зря недооценивают. Это вполне полноценный язык программирования, который есть практически на любой платформе. При этом на нём можно и математические функции программировать, и обработку текста, разное. И он умеет, неожиданно, работать с сокетами! С ком-портами можно заставить (с помощью stty и какой-то матери). Да там даже встроенный дебаггер есть! 

То что он умеет обрабатывать текст -- это лишь следствие, что весь awk-скрипт как бы завёрнут в гигантский while(1) в начале которого читают очередную строку. Такое в любом языке опять же можно руками сделать... Но собственно в этом и недостаток, по сравнению с expect. Последний работает не со строками -- он в буфер набирает данные пока не найдёт регэксп. И в буфере может находиться сразу множество строк. А awk вынужден работать только с такими данными, которые бьются по строкам. В большинстве случаев (ответы модема, например) -- это так. И на самом деле нет проблем многострочный регэксп в expect, например, разбить на отдельные регэкспы и последние рассматривать в рамках конечного автомата. Вообще типичная программа на awk быстро превращается в что-то такое:


BEGIN { s = 0 }

/regexp.../ && s == 0 {do something...;  s = 1 }
/regexp.../ && s == 1 {...}
/regexp.../ && s == 2 {... s == 3... }

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


Ну и в awk можно при желании руками делать getline и всё будет как в любом языке.

[ZX]