Шрифт:
Интервал:
Закладка:
$> = 0x10 | 0х0е;
print "tt", "Number", "tt", "Square root of numbern";
for ($i =1; $i < 10; $i++) {
sleep 500;
$> = 7; print "nntt";
$> = 10; print $i;
$> = 7; print "tt";
$> = 12; print sqrt($i);
}
warn " ";
Рассмотрим использованные в примере элементы языка QSL (также учтите сноску внизу статьи).
Комментарии, то есть то, что не подлежит выполнению, показываются символом #. Действие этого символа простирается до конца строки. Символ; разделяет команды скрипта. Пробелы в командах и операторах игнорируются. Все команды и операторы должны быть в нижнем регистре (маленькие, прописные буквы).
QSL интерпретатор не держит консоль открытой, консоль вызывается только при необходимости, при завершении скрипта закроется и консоль. Для того чтобы задержать консоль на экране в данном примере используется команда warn. Эта команда выводит указанное сообщение (то, что в парных кавычках, в нашем примере пустое место — пробел) или сообщения в диалоге и задает вопрос «да/нет». Если мы ответим «нет», то скрипт завершается (в нашем примере он в любом случае завершается, поскольку это последняя команда) с кодом «0» (нормальный выход с кодом «1»). Это может быть использовано при вызове QSL из других программ и скриптов (например, из *.bat файлов), но для нашего примера это сейчас неважно.
Команда sleep приостанавливает выполнение скрипта на указанное число миллисекунд. Ее применение в данном примере не особо важно, просто замедляется вывод. В основном она используется для временного согласования вывода и вычислений. Интерпретатор производит вычисления достаточно быстро, тогда как вывод данных наружу зачастую должен осуществляться с определенным интервалом.
Всю работу по выводу делает команда print. Она вызывает консоль и выводит указанный список данных. Элементы списка разделяются запятой. В частном случае может быть просто один элемент. То, что в двойных кавычках выводится как текст (символьная строка) и всегда преобразуется к этому виду. Обратите внимание, что этом примере выводимое первой командой print, можно записать как один элемент, а не список. Символьная строка может включать специальные (управляющие) символы. То, что это управляющий символ, указывается слешем .
В примере для вывода использовался символ табуляции t и символ перевода строки n.
Другим выводимым элементом является содержимое переменной с именем «i». Все переменные имеют предшествующий символ $. Переменные могут иметь любые имена, состоящие из букв, цифр и символа подчеркивания, но первый символ в имени переменной должен быть буквой. Имена переменных зависят от регистра, то есть переменные $Data и $data являются разными. Имена в разных видах хранения независимы, интерпретатор не спутает переменную $days с массивом переменных @days. Переменные в памяти компьютера создаются интерпретатором при первом их упоминании, так что мы не заботимся об их создании. Одни и те же переменные могут содержать числа и/или текст. Представление содержания переменных в нужном формате, при выводе, берет на себя интерпретатор. Если нам что-то не нравится в выводе, то нужно использовать команду форматированного вывода printf, хорошо знакомую программирующим на языке «С».
Особой группой переменных являются системные переменные, они уже существуют до выполнения первой команды, содержат данные (которые по умолчанию) и их имена зарезервированы. В данном примере была использована системная переменная, хранящая цвет и фон выводимых символов $>.
Запись в переменные осуществляется с помощью операции =. Обратите внимание, что в первой записи в переменную $>, участвовали два числа, в шестнадцатеричном представлении, объединенные в одно с помощью битовой операции «или»: |. А в дальнейшем записывалось десятичное представление кодов цвета — это кому, что нравится.
Последняя команда print выводит значение, возвращаемое функцией квадратного корня из числа sqrt(). Вообще говоря, можно писать print($i) и sqrt $i, это кто как привык. То же самое можно сказать об использовании подавляющего большинства команд.
В QSL последовательность (группа) команд может быть интерпретирована как одна команда (блок), если эта группа команд заключена в фигурные скобки. Блок может иметь присваиваемое имя, в этом случае он называется подпрограммой. В данном примере подпрограмм нет, но есть блок. В частном случае блок или подпрограмма может содержать только одну команду.
Еще в этом примере есть оператор циклического повторения в форме for(EXPR1;EXPR2;EXPR3) BLOCK. В переводе на обычный язык это означает: выполнять блок BLOCK с начальным значением переменной из выражения EXPR1 до тех пор, пока будет верным выражение EXPR2, после каждого выполнения блока менять содержание переменной в соответствии с выражением EXPR3 (++ означает добавление единицы). Что интерпретатор и делал.
Урок 2. Вывод в файл
Скрипт Lesson 2 выводит в файл rand.txt 1000 случайных чисел в диапазоне от 0 до 100. Заодно вы можете проверить насколько распределение псевдослучайных чисел, генерируемых в QSL, соответствует равномерному распределению.
# Lesson 2
$file = "rand.txt";
srand;
open (DATA, "»\temp\$file") || die """";
for($i=0; $i<1000; $i++) {
print DATA $i, "t", int(rand(100)), "rn";
}
close DATA;
До выполнения работы по выводу, скрипт осуществляет некоторые подготовительные мероприятия. Первым делом он записывает название файла в переменную $file. Это удобно тем, что в реальном скрипте название файла может использоваться несколько раз, если использовать вместо названия переменную с ним, то, в случае необходимости, смену названия можно сделать только в одном месте по тексту скрипта. QSL включает в себя также ряд средств для взаимодействия с пользователем — название файла можно вводить и в диалогах вызываемых командами ask, аореn.
Второе мероприятие заключается в выборе начального значения псевдослучайной последовательности чисел командой srand. Эта команда без аргумента, в качестве его использует значение возвращаемое командой time, то есть значение счетчика секунд с момента начала компьютерной эры (1 января 1970 года, ровно в полночь).
Вывод данных в файл осуществляет та же самая команда print, но с одним существенным дополнением. Для того чтобы сделать вывод в какой-нибудь файл или устройство, нужно указывать дескриптор для этого файла или устройства. Обратите внимание, что в команде print дескриптор указан сразу после имени команды и не отделяется запятой (не входит в список). Дескриптор файла на самом деле содержит всю необходимую информацию о файле или устройстве и должен быть предварительно создан командой open. В QSL заложен только один постоянный дескриптор CONSOLE, он просто используется командой print по умолчанию, поэтому не указывается, но дескриптор по умолчанию может быть изменен.
Рассмотрим использование команды open в этом примере. DATA