Интернет-журнал "Домашняя лаборатория", 2007 №5
Шрифт:
Оператор < > считывает все символы строки из файла до \n (код 10), как это принято в UNIX и встречается под MS Windows. Следовательно, оставшийся в конце строки \r (код 13) является для нас лишним. Для его удаления использовалась команда chop, по умолчанию удаляющая последний символ, в переменной $_.
Каждая строка, данного файла имеет вначале номер строки, он нам не нужен. Выделить нужные данные можно с помощью команды разбиения строки split. Эта команда разделяет строку на составляющие, по умолчанию из переменной $_ и используя пробелы и табуляции как
То, что нам нужно будет в переменной $num, но это будет текст, не число. Превратить текст в число можно, например, с помощью функции dec, которая работает только с десятичной записью числа (для октальных и шестнадцатеричных записей есть другие функции).
Полученное число добавляется в массив переменных @data с помощью команды push.
Осталось отсортировать массив @data и записать отсортированный в массив @sdata, что и было сделано с помощью команды sort.
Переходим к печати на принтере. Для этого должен быть открыт как файл, параллельный порт, к которому подключен принтер. Надеюсь, у вас тоже такой есть. Если принтер у вас сетевой, то этот пример вы не сможете использовать и можете смело переходить к следующему разделу, который посвящен средствам системы SOROS, включающим и возможность работы с сетевыми принтерами. Собственно говоря, QSL знает только последовательные порты, например СОМ1, COM2 и параллельные, например LPT1, но управлять он ими не умеет, это является функцией операционной системы. Для полного доступа к этим портам QSL должен использовать внешние программы, например средства системы SOROS.
Если бы мы использовали для вывода конструкцию print @sdata, то получили бы все числа напечатанные подряд. Чтобы вывести числа в столбик, в данном примере, был использован оператор повторения блока foreach. Этот оператор выполняет блок для каждой переменной массива, содержимое которой присваивается какой-либо, упоминаемой после имени оператора, но по умолчанию, как в нашем примере, присваивается системной переменной $_. Остается только вывести ее на принтер, снабдив символом перевода строки.
Взаимодействие с внешними программами
В первую очередь речь идет о взаимодействии со средствами пакета SOROS. Основу пакета составляют несколько мини-серверов осуществляющих операции чтения-записи устройств компьютера (параллельные и последовательные порты, все звуковые устройства) и обменивающихся данными с другими модулями пакета SOROS (soros.exe).
Запуск мини-серверов осуществляется нажатием кнопок на модуле DEVICE. Для каждого номера порта или звуковой карты запускается своя копия мини-сервера. Одновременно может быть запущено несколько мини-серверов. На рисунке для примера запущен сервер, оперирующий первым параллельным портом. Контрольно-измерительные модули PARALLEL (параллельный порт), SERIAL (последовательный порт) и INPUT (звуковая карта) могут подключаться к нужной копии минисервера. Для этого они имеют переключатель номера порта/карты (над кнопкой Read). На рисунке модуль PARALLEL подключен к серверу LPT1. Чтение устройства осуществляется кнопкой Read.
Для каждого доступного бита есть своя кнопка установки, но запись установленных битов в порт осуществляется кнопкой Set.На рисунке можно видеть, после чтения, что в порте LPT1, на 1, 5, 8, 10, 13 и 15 выводах разъема установлена логическая единица, а на остальных, соответственно, ноль.
Для запуска осциллографа INPUT нужно не только выбрать номер карты (соответствующий мини-сервер должен быть запущен), но и длительность развертки (время чтения) по оси X. Соответствующие переключатели выбирают усиление и положение на оси Y. Кнопка Stat на модуле INPUT переключает осциллограф в режим показа гистограммы входного сигнала.
Сброс системы SOROS в исходное состояние осуществляется кнопкой Init на контроллере крейта CRATE. Кнопка Printer, там же, позволяет запустить минисервер для принтера. На окне этого сервера можно выбрать нужный принтер, подключится к нему, и выбрать имя для сервера. Подразумевается, что будет использован сетевой принтер, поскольку параллельный порт (порты) необходимы для подключения контрольно-измерительных устройств. Переключатель Strob запускает режим циклического чтения (когда не 0 и кликнута кнопка Read). Чем больше значение на переключателе, тем реже производится чтение (делитель частоты стробового импульса).
При нажатой кнопке Setup можно подшить какой-либо скрипт, написанный на языке QSL, к кнопке на модуле PROGRAM, при ее нажатии конечно. Когда Setup отжата, кнопки модуля PROGRAM могут запускать скрипты на выполнение. Любой QSL скрипт можно также выбрать и выполнить с помощью кнопки Run.
К мини-серверам пакета SOROS может подключаться и интерпретатор QSL. Для взаимодействия с серверами используется «клиент-сервер» модель и DDE. QSL всегда является клиентом с именем «QSL». Сервер может быть открыт как файл, командой open. Имена внешних программ (драйверов) должны предваряться символом #. Сами имена мини-серверов уже заложены внутри их программ, но входящий в них номер порта/карты выбирается при запуске с панели системы SOROS. К некоторым устройствам, таким как аудио и видео периферия, командные последовательности могут быть посланы через MCI (смотрите документацию на QSL и MCI). К настоящему моменту в пакет входит всего 4 сервера: принтер, параллельный порт, последовательный порт и звуковая карта, но каждый желающий может изменить их или добавить другие. Все источники предоставляются.
Далее следуют примеры программирования скриптов для работы с минисерверами.
Урок 4. И снова принтер
# Lesson 4
open (PRN, ">#printer) || die "";
print PRN "Nice weather today, isn't it?\n";
close PRN;
Надо полагать, что в этом примере все уже знакомо. Следует учесть только, что до его выполнения соответствующий сервер должен быть запущен и настроен. Тоже самое относится и к последующим примерам.
Урок 5. Параллельный порт
В действительности QSL не имеет каких-либо специальных команд для контроля драйверов. Одним из возможных решений этой проблемы может являться использование управляющих символов в выводимых данных и использование отрицательного размера буфера для ввода в стандартных командах ввода-вывода QSL.
# Lesson 5
open(LPT, "+#LPT1") || die "";
$reg = " ";
read(LPT, $reg, — 2); # read status and control registers