Http
Клиентская часть реализации протокола HTTP/1.0.
- Синтаксис
- Описание
- Команды
- Массив состояния транзакции
package require http?2.0?::http::config ?options?
::http::geturl url ?options?
::http::formatQuery list
::http::resetk token
::http::wait token
::http::status token
::http::size token
::http::code token
::http::data token
Пакет http обеспечивает клиентскую часть протокола HTTP/1.0 и реализует операции GET, POST и HEAD. Он позволяет конфигурировать сервер-представитель (proxy) для выхода через межсетевые экраны. Пакет совместим с политикой безопасности Safesock.Процедура ::http::geturlвыполняет HTTP транзакцию. В зависимости от заданной опции это может быть GET, POST или HEAD транзакция. Величина, возвращаемая процедурой ::http::geturl, является признаком (token) выполнения транзакции. Кроме того, ее значение совпадает с именем массива в пространстве имен ::http, который содержит информацию о выполнении транзакции. Элементы массива описаны ниже, см. “Массив состояния транзакции”.
Если процедура вызвана с опцией -command, операция выполняется в фоновом режиме. Процедура ::http::geturl завершается сразу после формирования HTTP запроса, а результаты запроса обрабатываются после их получения. Для успешной работы в таком режиме необходимо, чтобы был запущен обработчик событий. Это всегда так для Tk-приложений. В чисто Tcl — приложениях можно использовать процедуру ::http::wait для запуска обработчика событий.
::http::config ?options?Команда ::http::config используется, чтобы установить или запросить имя proxy-сервера, порта и пользовательского приложения (User-Agent), используемые в HTTP запросах. Если никакие опции не заданы, возвращается текущая конфигурация. Если задан единственный аргумент, тогда, он должен быть именем одной из опций, описанных ниже. В этом случае возвращается текущая величина указанной опции. В противном случае аргументы состоят из пар: имя опции — присваиваемое значение.
-accept mimetypes::http::geturl url ?options?Определяет типы документов, которые могут быть приняты по запросу. Значение по умолчанию ‘*/*’ означает, что могут быть приняты документы любого типа. Чтобы ограничить список допустимых документов, можно использовать список (через запятую) шаблонов документов следующего вида: “image/gif, image/jpeg, text/*”.-proxyhost hostnameИмя proxy-сервера, через который осуществляется связь. Если не указано, связь осуществляется напрямую.-proxyport numberИмя proxy-порта.-proxyfilter commandОпределяет команду, которая возвращает имена proxy-сервера и proxy-порта, необходимые для данной связи. В противном случае возвращает пустое значение. В качестве аргумента при вызове команды используется имя сервера (host). Если команда не задана, используются значения опций -proxyhost и -proxyport.-useragent stringОпределяет имя пользовательского приложения (User-Agent). Значение по умолчанию “Tcl http client package 2.0.”Команда ::http::geturl — основная команда пакета. Если задана опция -query, выполняется операция POST, если задана опция -validate, выполняется операция HEAD. В противном случае выполняется операция GET. Команда возвращает признак — имя массива, который может быть использован для получения дополнительной информации о состоянии транзакции. Подробности см. “Массив состояния транзакции”. Команда завершается после завершения соответствующей операции, если она вызвана без опции -command. В противном случае команда ::http::geturl завершается немедленно, а по завершении операции вызывается соответствующая команда для обработки ее результатов. Команда ::http::geturl может использоваться с различными опциями:
-blocksize size
Используется при чтении информации. Определяет максимальный размер блока (в байтах), который может быть прочитан за один раз. После каждого чтения блока вызывается команда, определенная с помощью опции -progress.
-channel nameПеренаправляет полученную информация в соответствующий канал вместо того, чтобы сохранять ее в переменной state(body).-command callbackОбеспечивает вызов команды callback после завершения транзакции. При использовании этой опции команда ::http::geturl завершается сразу. Команда callback вызывается с аргументом token, который содержит имя массива, описанного ниже, см. “Массив состояния транзакции”. Ниже приведен шаблон типовой процедуры для использования в данной опции:proc httpCallback {token} {upvar #0 $token state}
# Далее возможна работа со state как с обычным Tcl-массивом
-handler callbackОпция обеспечивает вызов команды callback как только HTTP данные получены. Команда получает два дополнительных аргумента: HTTP socket и имя массива token, возвращенное командой ::http::geturl (см. “Массив состояния транзакции”). Команда должна возвращать число байтов, прочитанных из socket. Ниже приведен шаблон подобной процедуры:proc httpHandlerCallback {socket token} {-headers keyvaluelistupvar #0 $token state}
# Получен доступ к socket и Tcl-массиву state
...
(например: set data [read $socket 1000];set nbytes [string length $data])
...
return nbytesОпция используется для включения в заголовок HTTP запроса дополнительных полей. Аргумент должен быть правильным списком с четным числом элементов, состоящим попеременно из ключей и их значений. Ключи используются как имена полей заголовка. Из значений удаляются символы перехода на новую строку, чтобы избежать формирования неправильного заголовка. Например, если keyvaluelist содержит список {Pragma no-cache} будет сформирован следующий заголовок запроса:Pragma: no-cache-progress callbackОпция обеспечивает вызов команды callback для обработки очередной порции данных. Команда callback получает три аргумента: значение token, возвращенное командой ::http::geturl, предполагаемый полный размер данных из мета-данных и текущее количество поступивших данных в байтах. Если едполагаемый полный размер неизвестен, вместо него подставляется 0. Ниже приведен шаблон для процедуры, вызываемой по опции -progress:::http::formatQuery key value?key value...?proc httpProgress {token total current} {upvar #0 $token state
}
-query queryЕсли указана данная опция, ::http::geturl формирует запрос POST и передает его на сервер. Запрос должен быть сформатирован. Для выполнения форматирования может использоваться процедура ::http::formatQuery.-timeout millisecondsЕсли значение milliseconds не равно нулю, устанавливается соответствующее время задержки. Задержка выполняется перед вызовом команды ::http::reset и команды, заданной опцией -command. Во время задержки команда ::http::status возвращает значение timeout.-validate boolean
Если значение boolean не равно нулю, ::http::geturl выполняет HTTP HEAD запрос. Такой запрос возвращает мета информацию об источнике данных (URL), а не его содержание. Мета информация содержится в переменной state(meta) (см. “Массив состояния транзакции”).Команда выполняет перекодирование запроса. Команда использует четное число аргументов, являющихся соответственно ключами запроса и их значениями. Она преобразует ключи и значения и возвращает одну строку, в которой расставлены необходимые “&” и “=” разделители. Результат можно использовать в качестве значения для опции -query команды ::http::geturl.::http::reset token?why?Команда перезапускает HTTP транзакцию token, если такая исполняется. Значение переменной state(status) при этом переустанавливается в why (по умолчанию — reset) и вызывается команда, заданная опцией -command.::http::wait tokenЭта команда обеспечивает ожидание завершения транзакции. Она работает только в надежных интерпретаторах, так как она использует команду vwait.::http::data tokenЭта команда возвращает значение переменной state(body).::http::status tokenЭта команда возвращает значение переменной state(status).::http::code tokenЭта команда возвращает значение переменной state(http).::http::size token
Эта команда возвращает значение переменной state(currentsize).
Команда ::http::geturl возвращает token — имя Tcl-массива, содержащего информацию о HTTP транзакции. Для упрощения доступа к массиву можно использовать следующую конструкцию:
upvar #0 $token state
Массив содержит следующие элементы:
bodyСодержание документа, заданного с помощью URL. Пусто, если указана опция -channel. Значение переменной можно получить также с помощью команды ::http::data.сurrentsizeТекущий объем информации в байтах, полученный от источника. Значение переменной можно получить с помощью команды ::http::size.errorЕсли элемент определен, он содержит строку с сообщением об ошибке, полученную при прерывании HTTP транзакции.httpЭлемент содержит значение HTTP статуса, полученное от сервера. Значение переменной можно получить также с помощью команды ::http::code. Статус представляет собой строку из трех цифр, значения которой соответствуют HTTP стандарту. Код 200 соответствует успешному выполнению транзакции. Коды, начинающиеся с ‘4’ или ‘5’, указывают на ошибку. Коды, начинающиеся с ‘3’, соответствуют ошибкам перенаправления. В этом случае мета данные Location определяют новый источник информации, который содержит запрошенные данные.metaМета данные, описывающие содержание документа. Данный элемент массива содержит список ключей и их значений. Чтобы облегчить доступ к данным можно использовать следующую конструкцию:
Пример:Content-Typearray set meta $state(meta)Некоторые ключи мета данных перечислены ниже, но в HTTP стандарте их перечислено больше, кроме того, сервер может добавлять собственные.Content-LengthТип документа. Например, text/html, image/gif, application/postscript или application/x-tcl.LocationОбъявленный размер документа. Реальный объем информации, полученной с помощью команды ::http::geturl, содержится в переменной state(size).statusИзмененный адрес документа.Возможные значения ok, reset или error. Во время транзакции значение пустое.totalsizeКопия значения мета данных Content-Length.typeКопия значения мета данных Content-Type.urlЗапрошенный адрес.
# Копирование источника в файл и печать мета данных
proc ::http::copy { url file {chunk 4096} } {set out [open $file w]incr max
set token [geturl $url -channel $out -progress ::http::Progress \
-blocksize $chunk]
close $out
# Следующая команда завершает строку, начатую процедурой http::Progress
puts stderr “”
upvar #0 $token state
set max 0
foreach {name value} $state(meta) {
if {[string length $name] > $max} {set max [string length $name]if {[regexp -nocase ^location$ $name]} {
}# Обработка перенаправления адреса}
puts stderr “Location:$value”
return [copy [string trim $value] $file $chunk]
}
foreach {name value} $state(meta) {puts [format “%-*s %s” $max $name: $value]return $token
}}
proc ::http::Progress {args} {
puts -nonewline stderr. ; flush stderr
}
|
|
|
|
|
|
::safe::interpCreate?slave??options...?
::safe::interpInit slave?options...?
::safe::interpConfigure slave?options...?
::safe::interpDelete slave
::safe::interpAddToAccessPath slave directory
::safe::interpFindInAccessPath slave directory
::safe::setLogCmd?cmd
arg...?
Safe Tcl — это механизм безопасного исполнения ненадежных Tcl скриптов и предоставления этим скриптам опосредованного доступа к потенциально опасным функциям.
Safe Tcl служит для того, чтобы ненадежные скрипты не смогли нарушить работу вызывающего их приложения: он предотвращает покушения на несанкционированный доступ к информации и нарушение целостности вызывающего этот скрипт процесса.
Safe Tcl позволяет интерпретатору-предку создавать безопасные интерпретаторы с ограниченными возможностями, в которых содержится набор предопределенных синонимов для команд source, load, file и exit и сохраняются возможности автозагрузки команд и пакетов.
Безопасный интерпретатор не позволяет получить какую-либо информацию о структуре файловой системы, поскольку для доступа к файлам в безопасном интерпретаторе используются специальные метки. Когда безопасный интерпретатор запрашивает доступ к файлу, он использует метку как часть виртуального имени файла. Родительский интерпретатор заменяет метку на реальное имя каталога и выполняет требуемую операцию с файлом. С помощью опций команд, описанных ниже, можно выбрать требуемый уровень безопасности интерпретатора.
Все команды для работыс безопасными интерпретаторами содержатся в
пространстве имен safe. Команда ::safe::interpCreate
создает безопасный интерпретатор. Возможные опции команды описаны ниже, см.
“Опции”.
Команда возвращает имя созданного интерпретатора. Команда ::safe::interpInit
аналогична, но ее первым аргументом должно быть имя интерпретатора,
созданного с помощью команды interp.
Команда ::safe::interpDelete
удаляет интерпретатор, имя которого использовано в качестве аргумента.
Команда ::safe::interpConfigure
позволяет задать опции для безопасного интерпретатора или получить
информацию об заданных ранее опциях. Подробно опции описаны ниже (см.
“Опции”).
Для каждого безопасного интерпретатора, созданного с помощью команды ::safe::interpCreate или инициированного с помощью команды ::safe::interpInit в родительском интерпретаторе создается список доступных каталогов — виртуальный путь. Каждый каталог в пути связывается с реальным каталогом локальной файловой системы и с меткой, доступной в безопасном интерпретаторе. В результате надежный интерпретатор обходится без сведений о реальной файловой системе на машине, на которой исполняется интерпретатор. Когда в надежном интерпретаторе используется метка для доступа к конкретному файлу (например, для выполнения команды source или load), метка заменяется в родительском интерпретаторе на настоящее имя каталога и необходимый файл ищется в файловой системе. Надежный интерпретатор не получает сведений о реальном имени файла в файловой системе. Для работы с виртуальными именами файлов предусмотрены специальные команды. Команда::safe::interpConfigure позволяет задавать новый виртуальный путь для интерпретатора. Команда ::safe::interpAddToAccessPath позволяет добавлять каталоги к виртуальному пути указанного безопасного интерпретатора. Команда ::safe::interpFindInAccessPath позволяет найти каталог в виртуальном пути для безопасного интерпретатора и получить его метку. Если каталог не найден, выдается сообщение об ошибке.
Команда ::safe::setLogCommand
позволяет задать скрипт, который выполняется при каждом событии в безопасном
интерпретаторе. Этот скрипт вызывается с одним аргументом — строкой,
содержащей описание события.
source fileName
file?options?
::safe::interpCreate?slave??options...?
::safe::interpFindInAccessPathslave
directory
Пример использования команды:
###Создание безопасного интерпретатора
::safe::interpCreate qqq
###Присваивание переменной tk_library метки соответствующего каталога
qqq eval [list set tk_library [::safe::interpFindInAccessPath qqq
$tk_library]]
###Выполнение команды source в безопасном интерпретаторе
qqq eval source \$tk_library/msgbox.tcl
::safe::setLogCmd puts stderr
NOTICE for slave interp10 : Created
NOTICE for slave interp10 :
Setting accessPath=(/foo/bar) staticsok=1 nestedok=0 deletehook=()
NOTICE for slave interp10 : auto_path in interp10 has been set to
{$p(:0:)}
ERROR for slave interp10 : /foo/bar/init.tcl: no such file or
directory
-accessPath?directoryList?
Чтобы исключить доступ к файлам, которые оказались в силу тех или иных причин в разрешенных для чтения в безопасном интерпретаторе каталогах, синоним команды source обеспечивает доступ только к файлам с расширением tcl, в именах которых содержится ровно одна точка, а общая длина имени не превышает четырнадцати символов.
По умолчанию в Tcl переменной auto_path содержатся метки для
каталогов, содержащихся в аналогичной переменной в родительском
интерпретаторе и их непосредственных подкаталогов. Первая метка в списке
присваивается также Tcl переменной tcl_library безопасного
интерпретатора. Вы можете сократить этот список, в явном виде задав
доступные каталоги для безопасного интерпретатора с помощью опции
-accessPath.
Safe Tcl — это механизм безопасного исполнения ненадежных Tcl скриптов и предоставления этим скриптам опосредованного доступа к потенциально опасным функциям.
Safe Tcl служит для того, чтобы ненадежные скрипты не смогли нарушить работу вызывающего их приложения: он предотвращает покушения на несанкционированный доступ к информации и нарушение целостности вызывающего этот скрипт процесса.
Safe Tcl позволяет интерпретатору-предку создавать безопасные интерпретаторы с ограниченными возможностями, в которых содержится набор предопределенных синонимов для команд source, load, file и exit и сохраняются возможности автозагрузки команд и пакетов.
Безопасный интерпретатор не позволяет получить какую-либо информацию о структуре файловой системы, поскольку для доступа к файлам в безопасном интерпретаторе используются специальные метки. Когда безопасный интерпретатор запрашивает доступ к файлу, он использует метку как часть виртуального имени файла. Родительский интерпретатор заменяет метку на реальное имя каталога и выполняет требуемую операцию с файлом. С помощью опций команд, описанных ниже, можно выбрать требуемый уровень безопасности интерпретатора.
Все команды для работыс безопасными интерпретаторами содержатся в
пространстве имен safe. Команда ::safe::interpCreate создает
безопасный интерпретатор. Возможные опции команды описаны ниже, см. “Опции”.
Команда возвращает имя созданного интерпретатора. Команда
::safe::interpInit аналогична, но ее первым аргументом должно быть
имя интерпретатора, созданного с помощью команды interp.
Команда ::safe::interpDelete удаляет интерпретатор, имя которого
использовано в качестве аргумента. Команда ::safe::interpConfigure
позволяет задать опции для безопасного интерпретатора или получить
информацию об заданных ранее опциях. Подробноопции описаны ниже (см. “Опции”).
Для каждого безопасного интерпретатора, созданного с помощью команды ::safe::interpCreate или инициированного с помощью команды ::safe::interpInit в родительском интерпретаторе создается список доступных каталогов — виртуальный путь. Каждый каталог в пути связывается с реальным каталогом локальной файловой системы и с меткой, доступной в безопасном интерпретаторе. В результате надежный интерпретатор обходится без сведений о реальной файловой системе на машине, на которой исполняется интерпретатор. Когда в надежном интерпретаторе используется метка для доступа к конкретному файлу (например, для выполнения команды source или load), метка заменяется в родительском интерпретаторе на настоящее имя каталога и необходимый файл ищется в файловой системе. Надежный интерпретатор не получает сведений о реальном имени файла в файловой системе. Для работы с виртуальными именами файлов предусмотрены специальные команды. Команда ::safe::interpConfigure позволяет задавать новый виртуальный путь для интерпретатора. Команда ::safe::interpAddToAccessPath позволяет добавлять каталоги к виртуальному пути указанного безопасного интерпретатора. Команда ::safe::interpFindInAccessPath позволяет найти каталог в виртуальном пути для безопасного интерпретатора и получить его метку. Если каталог не найден, выдается сообщение об ошибке.
Команда ::safe::setLogCommand позволяет задать скрипт, который
выполняется при каждом событии в безопасном интерпретаторе. Этот скрипт
вызывается с одним аргументом — строкой, содержащей описание события.
Синтаксис и семантика языка Tcl определены описанным ниже образом.Скрипт на Tcl представляет собой одну или более команд. Символы точки с запятой (;) и новой строки служат разделителями команд, если не находятся между символами кавычек. Закрывающие скобки служат окончанием тела команды при подстановках команд, если не находятся между символами кавычек.
Команда обрабатывается за два прохода. При первом проходе интерпретатор Tcl разбивает команду на слова и выполняет подстановки, как рассказано ниже. Эти подстановки выполняются одинаково для всех команд. Первое слово считается именем процедуры, которая исполняет команду. Когда процедура найдена, ей передаются остальные слова команды. Процедура может интерпретировать каждое из слов произвольным образом, например, как число, имя переменной, список или Tcl скрипт. Разные командные процедуры интерпретируют свои слова по-разному.
Слова команд разделяются пробельными символами (пробел, табуляция). Символ новой строки разделяет команды.
Если первый символ слова есть двойные кавычки (”), то слово должно заканчиваться также на двойные кавычки. Если в промежутке между знаками кавычек находятся точка с запятой, закрывающая скобка или пробельные символы (включая символ новой строки), то они будут поняты как обычные символы в составе слова. Подстановки команд, переменных и подстановки с обратным слешем в таком слове описаны ниже. Двойные кавычки не являются частью слова.
Если слово начинается с открывающей фигурной скобки ({), то оно должно заканчиваться на парную ей закрывающую скобку (}). Внутри фигурных скобок могут также содержаться слова в фигурных скобках. При этом каждая открывающая фигурная скобка должна иметь парную ей закрывающую фигурную скобку. Однако, если открывающая или закрывающая фигурная скобка отмечена обратным слешем, то она не учитывается при поиске парной скобки. Для символов между фигурными скобками не выполняется никаких подстановок, за исключением описанной ниже подстановки “обратный слеш — новая строка“. Также не приписывается никакого специального смысла символам точки с запятой, новой строки, закрывающей скобки и пробела. Слово будет состоять из символов между скобками, за исключением самих скобок.
Если слово содержит открывающую квадратную скобку ([), то Tcl выполняет подстановку команды. Для этого он рекурсивно вызывает интерпретатор Tcl, который обрабатывает символы, следующие за скобкой, как скрипт Tcl. Скрипт может иметь любое количество команд и должен оканчиваться закрывающей квадратной скобкой (]). Результат выполнения скрипта (т.е., результат его последней команды) подставляется в слово на место скобок и всех символов между ними. В слове может быть любое количество подстановок команд. Подстановки команд не выполняются в словах, заключенных в фигурные скобки.
Если слово содержит символ доллара ($), тогда Tcl выполняет подстановку переменной: символ доллара и последующие символы заменяются в слове на значение этой переменной. Существует три способа подстановки переменной:
$nameЗдесь name — имя скалярной переменной, оно заканчивается любым символом, за исключением буквы, цифры или символа подчеркивания.$name(index)Здесь name есть имя массива данных, а index — имя элемента внутри этого массива. Name должен состоять только из букв, цифр и символов подчеркивания. Все виды подстановок выполняются по отношению к символам index.${name}Здесь name — имя скалярной переменной, оно может состоять из каких угодно символов, кроме закрывающей фигурной скобки.
В слове может быть любое количество подстановок переменных. Подстановки переменных не выполняются для слов, заключенных в фигурные скобки.Если в слове есть символ обратного слеша, то выполняется подстановка с обратным слешем. Во всех случаях, кроме перечисленных ниже, обратный слеш пропускается, а следующий за ним символ обрабатывается как обычный символ и включается в состав слова. Таким способом в слово можно включать такие символы, как двойные кавычки, закрывающие скобки и символ доллара без непреднамеренной специальной обработки. Ниже перечислены последовательности символов, для которых подстановка с обратным слешем выполняется специальным образом, и соответствующие подставляемые значения.
| \a | Звуковой сигнал (гудок) (0х7). |
| \b | Сдвиг на одну позицию влево (0х8). |
| \f | Прогон листа (0хс). |
| \n | Новая строка, newline (0ха). |
| \r | Возврат каретки (0хd). |
| \t | Табуляция (0х9). |
| \v | Вертикальная табуляция (0xb). |
| \<newline>пробел | Обратный слеш, символ новой строки и все пробелы и табуляции после этого символа заменяются на одиночный пробел. Данная последовательность уникальна в том смысле, что она замещается в отдельном суб-проходе перед тем, как начинается непосредственно анализ команды. Поэтому эта последовательность будет замещена, даже если она стоит между фигурными скобками, и результирующий пробел будет интерпретироваться как разделитель слов, если только он не будет стоять между фигурными скобками или кавычками. |
| \\ | Обратный слеш (\). |
| \ooo | Цифры ooo (одна, две или все три) дают восьмеричное значение символа. |
| \xhh | Шестнадцатеричное число ‘hh’ дает шестнадцатеричное значение символа. Может присутствовать любое количество цифр. |
Если символ ‘#’ будет стоять в том месте, где Tcl предполагает первый символ первого слова команды, то этот символ и все последующие символы до следующего символа новой строки включительно истолковываются как комментарии и игнорируются. Символ комментария действителен только тогда, когда он стоит в начале команды.
При воссоздании слов команды каждый символ обрабатывается интерпретатором Tcl только один раз. Например, если выполнялась подстановка переменной, то в значении переменной никаких подстановок не производится; значение вставляется в слово без изменений. Если выполнялась подстановка команды, то вставленная команда обрабатывается целиком посредством рекурсивного вызова интерпретатора Tcl; не делается никаких подстановок перед рекурсивным вызовом и не делается никаких дополнительных подстановок в результат исполнения вставленного скрипта.
Подстановки не воздействуют на границы слов в команде. Например, при подстановке переменной все значение переменной становится частью одного слова, даже если это значение содержит пробелы.
Команда after указывает, что некоторая команда должна быть выполнена с задержкой по времени.after ms?script script script...?
after cancel id
after cancel script script script...
after idle?script script script...?
after info?id?
Команда дописывает значения аргументов к значению переменной.
СИНТАКСИС
append varName?value value value...?ОПИСАНИЕ
Команда append добавляет все аргументы value к значению переменной varName. Если такой переменной не было, она будет создана, и ее значение будет равно соединению значений аргументов value. Эта команда предоставляет удобный способ постепенного наращивания длинных переменных. сЕли переменная a содержит длинное значение, то команда “append a $b" выполняется значительно быстрее, чем “set a $a$b" .
ОПИСАНИЕarray option arrayName?arg arg...?
array anymore arrayName searchId
array donesearch arrayName searchId
array exists arrayName
array get arrayName?pattern?
array names arrayName?pattern?
array nextelement arrayName searchId
array set arrayName list
array size arrayName
array startsearch arrayName
Эта команда предназначена для выполнения перечисленных ниже операций с массивами. Если иное не оговорено специально, arrayName должно быть именем существующего массива. Аргумент option определяет конкретную операцию. Для команды определены перечисленные ниже опции.
array anymore arrayName searchId
Возвращает ‘1’ если при выполнении команды поиска (см. ниже) остались невыбранные элементы массива, и ‘0’ в противном случае. SearchId указывает операцию поиска, информация о которой запрашивается (величина searchId возвращается при выполнении команды array startsearch). Эта опция особенно удобна, если массив содержит элемент с пустым именем, поскольку команда array nextelement не позволяет в таком случае определить, закончен ли поиск.array donesearch arrayName searchIdКоманда прерывает поиск элементов массива и удаляет всю связанную с поиском информацию. SearchId указывает операцию поиска, информация о которой удаляется (величина searchId возвращается при выполнении команды array startsearch). Команда возвращает пустую строку.array exists arrayNameВозвращает ‘1’, если arrayName есть имя массива, и ‘0’, если такой переменной не существует или она является скалярной переменной.array get arrayName?pattern?Возвращает список, содержащий пары элементов. Первый элемент пары — имя элемента массива arrayName, второй элемент пары — значение этого элемента. Порядок пар не определен. Если шаблон не задан, то все элементы массива будут включены в результат. Если шаблон задан, то в результат будут включены только те элементы, чьи имена соответствуют шаблону (используя те же правила, что и в команде glob). Если arrayName не является переменной массива или массив не содержит элементов, то возвращается пустой список.array names arrayName?pattern?Возвращает список, содержащий имена всех элементов массива, соответствующих шаблону (используя те же правила, что и в команде glob). Если шаблона нет, то команда возвращает имена всех элементов массива. Если в массиве нет элементов, соответствующих шаблону или arrayName не является именем переменной массива, то возвращается пустая строка.array nextelement arrayName searchIdВозвращает имя следующего элемента массива arrayName, или пустую строку, если все элементы массива уже возвращены. SearchId указывает операцию поиска, (величина searchId возвращается при выполнении команды array startsearch). Предупреждение: если в массив внесен новый элемент или из массива удален один из элементов, то все операции поиска в этом массиве автоматически заканчиваются, как если бы была выполнена команда array donesearch. Соответственно, попытка выполнить после этого команду array nextelement приведет к ошибке.array set arrayName listУстанавливает значение одного или нескольких элементов массива arrayName. Список list должен иметь такую же структуру, как список, возвращаемый командой array get, то есть состоять из четного числа элементов. Все нечетные элементы списка рассматриваются как имена элементов массива arrayName, а следующие за ними четные элементы — как новые значения соответствующих элементов.array size arrayNameВозвращает строку, содержащую десятичное число, равное количеству элементов указанного массива. Если arrayName не является именем массива, возвращается ‘0’.array startsearch arrayNameЭта команда инициализирует процесс поиска элементов указанного массива. После этого имя каждого следующего элемента массива можно получить с помощью команды array nextelement. По завершении поиска необходимо выполнить команду array donesearch. Команда array startsearch возвращает идентификатор процесса поиска, который должен использоваться в командах array nextelement и array donesearch. Благодаря этому механизму возможно проведение нескольких процессов поиска элементов одного и того же массива одновременно.
Команда bgerror предназначена для обработки фоновых ошибок
(background errors).
СИНТАКСИС
Если до вызова обработчиком событий команды bgerror произошло несколько фоновых ошибок, то, как правило, команда будет вызвана для каждой из обнаруженных ошибок. Однако, если сама команда bgerror возвращает код break (см. описание команды return), последующие ее вызовы пропускаются.
В чисто Tcl-приложениях команда bgerror не реализована. Однако, в Tk-приложениях определена процедура bgerror, которая выводит сообщение об ошибке в диалоговое окно и позволяет пользователю просмотреть стек, описывающий, где именно эта ошибка произошла.
binary
scan string formatString?varName varName...?
Шаблон formatString содержит последовательность из нуля или более спецификаторов преобразования, разделенных одним или более пробелами. Каждый спецификатор преобразования состоит из буквы, за которой может следовать число count. Как правило, спецификатор использует один из аргументов arg чтобы получить величину для форматирования. Буква в спецификаторе указывает тип преобразования (форматирования). Число count обычно указывает сколько объектов для форматирования выбирается из значения arg. Соответственно, count должно быть неотрицательным десятичным числом. Если значение count равно ‘*’, это обычно указывает, что надо использовать все значение аргумента. Если число аргументов arg не соответствует числу спецификаторов, требующих для себя дополнительного аргумента, выдается ошибка.
Обычно результат каждого нового преобразования дописывается в конец возвращаемой строки. Однако, с помощью специальных спецификаторов точку ввода нового значения (курсор) можно передвигать по формируемой строке.
Ниже приведены допустимые значения спецификаторов преобразований и
описаны соответствующие преобразования.
binary format a7a*a alpha bravo charlie
вернет строку, эквивалентную alpha\000\000bravoc.
binary format A6A*A alpha bravo charlie
вернет alpha bravoc.
binary format b5b* 11100 111000011010
вернет строку, эквивалентную \x07\x87\x05.
binary format B5B* 11100 111000011010
вернет строку, эквивалентную \xe0\xe1\xa0.
Например, команда
вернет строку, эквивалентную
\xba\xed\x0f.
вернет строку, эквивалентную \xab\xde\xf0.
Например, команда
вернет строку, эквивалентную \x03\xfd\x80\x01\x02\x05,
тогда как команда
вернет ошибку.
вернет строку, эквивалентную
\x03\x00\xfd\xff\x02\x01.
вернет строку, эквивалентную
\x00\x03\xff\xfd\x01\x02.
вернет строку, эквивалентную
\x03\x00\x00\x00\xfd\xff\xff\xff\x00\x00\x10\x00
вернет строку, эквивалентную
\x00\x00\x00\x03\xff\xff\xff\xfd\x00\x10\x00\x00
вернет строку, эквивалентную
\xcd\xcc\xcc\x3f\x9a\x99\x59\x40.
вернет строку, эквивалентную
\x9a\x99\x99\x99\x99\x99\xf9\x3f.
вернет строку, эквивалентную
abc\000def\000\000ghi.
вернет dghi.
вернет ‘2’. В переменной var1 будет записано
‘01110’. В переменной var2 —
‘1000011100000101’.
вернет `2’. В переменной var1 будет записано 706.
В переменной var2 — ‘50`.
вернет ‘2.’. В переменной var1 будет записано
“078.”. В переменной var2 —
‘05’.
вернет ‘2’. В переменной var1 будет записана строка “7
-122". В переменной var2 — ‘5’. Обратите внимание, что
команда возвращает числа со знаком. Чтобы преобразовать их в числа без знака
можно использовать выражение:
вернет ‘2’. В переменной var1 будет записана строка '5
7'. В переменной var2 — ‘-16’. Обратите внимание, что
команда возвращает числа со знаком. Чтобы преобразовать их в числа без знака
можно использовать выражение:
вернет ‘2’. В переменной var1 будет записана строка '5
7'. В переменной var2 —
‘-16’.
binary\x00\x00\x00\x05\x00\x00\x00\x07\xff\xff\xff\xf0 I2I* var1 var2
вернет ‘2’. В переменной var1 будет записана строка “5 7". В переменной var2 — ‘-16’.
вернет ‘1’. В переменной var1 будет записано
‘1.6000000238418579’.
binary scan\x9a\x99\x99\x99\x99\x99\xf9\x3f d var1
вернет ‘1’. В переменной var1 будет записано ‘1.6000000000000001’.
вернет ‘1’. В переменной var1 будет ‘0304’.
Преобразование не требует дополнительной переменной
varName.
вернет ‘2’. В переменной var1 будет ‘1 2’. В
переменной var2— ‘020304’.. Преобразование не требует
дополнительной переменной varName.
вернет ‘2’. В переменной var1 будет ‘1 2’. В
переменной var2 — ‘020304’. Преобразование не требует
дополнительной переменной varName.
case string?in? {patList body? body...?}
catch
clock clicks
%% — вставляет %.
%a — сокращенное название дня недели (Mon, Tue, etc.).
%A — полное название дня недели (Monday, Tuesday, etc.).
%b — сокращенное название месяца (Jan, Feb, etc.).
%B — полное название месяца.
%c — локальные дата и время.
%d — день месяца (01 — 31).
%H — часы в двадцатичетырехчасовом формате (00 — 23).
%I — часы в двенадцатичасовом формате (00 — 12).
%j — день года (001 — 366).
%m — номер месяца (01 — 12).
%M — минуты (00 — 59).
%p — AM/PM индикатор (до/после полудня).
%S — секунды (00 — 59).
%U — неделя года (01 — 52), Воскресенье — первый день недели.
%w — номер дня недели (Воскресенье = 0).
%W — неделя года (01 — 52), Понедельник первый день недели.
%x — локальный формат даты.
%X — локальный формат времени.
%y — год без столетия (00 — 99).
%Y — год со столетием (например, 1990)
%Z — имя часового пояса.
Кроме того, в некоторых операционных системах могут поддерживаться
%D — дата в формате %m/%d/%y.
%e — день месяца (1 — 31), без нулей впереди.
%h — сокращенное имя месяца.
%n — новая строка.
%r — время в формате %I:%M:%S %p.
%R — время в формате %H:%M.
%t — табуляция.
%T — время в формате %H:%M:%S.
Если аргумент -format не задан, используется формат %a %b %d %H:%M:%S %Z %Y. Если задан аргумент -gmt, следующий аргумент должен быть булевой величиной. Значение true означает, что используется время по Гринвичу, значение false означает, что используется время по локальному часовому поясу, который задан для операционной системы.
clock scan dateString?-base clockVal??-gmt boolean?
Если в команде указан флаг -base, следующий аргумент должен содержать время в виде целого числа. По этому числу определяется дата и используется вместо указанной в строке или текущей. Такая возможность полезна при необходимости перевести в целое число время на заданную дату.
Аргумент dateString должен состоять из одной или более спецификаций следующих видов:
Date — Месяц, день и, возможно, год. Допустимые форматы mm/dd?/yy?, monthname dd?, yy?, dd monthname?yy? и day, dd monthname yy. По умолчанию год считается текущим годом. Если год меньше 100, то года 00-38 считаются годами в диапазоне 2000-2038, а года 70-99 считаются годами в диапазоне 1970-1999. Года 39-70 могут быть недопустимыми на некоторых платформах. Для тех платформ, для которых они определены, они считаются годами в диапазоне 1939-1999.
Реальная дата вычисляется в следующей последовательности. Сначала определяется абсолютная дата и/или время, которые переводятся в целое число. Это число используется как базис, к которому добавляется заданный день недели. Далее используется относительное время. Если задана дата, а время (абсолютное или относительное) отсутствует, считается, что это полночь. И последним шагом производится коррекция вычисленной даты, при которой учитываются летнее время и число дней в различных месяцах.
close channelIdОПИСАНИЕ
Команда close закрывает канал, идентификатор которого задан аргументом channelId. Идентификатор channelId возвращается командами open и socket при открытии канала.Команда отправляет все накопившиеся в выходном буфере данные на выходное устройство канала, удаляет все данные во входном буфере, закрывает назначенное каналу устройство или файл. Доступ к каналу прекращается.
Для каналов в блокирующем и неблокирующем режимах действие команды несколько различно. Если канал находится в блокирующем режиме, команда завершается только после завершения вывода данных из буфера. В противном случае команда завершается немедленно, а вывод данных из буфера производится в фоновом режиме. Канал закрывается после завершения вывода.
Если канал в блокирующем режиме открыт для конвейера, команда close завершается после завершения порожденного процесса.
Если канал совместно используется несколькими интерпретаторами, то команда делает канал channelId недоступным в вызвавшем команду интерпретаторе, но не оказывает никакого другого действия на канал, пока все использующие канал интерпретаторы не закроют его. При выполнении команды в последнем из интерпретаторов, использовавших его, выполняются описанные выше действия. Подробности совместного использования канала несколькими интерпретаторами приведены в описании команды interp.
Команда close возвращает пустую строку. Она может порождать ошибку, если при выводе данных произошла ошибка.
Команда соединяет списки в один общий список.СИНТАКСИС
concat?arg arg...?ОПИСАНИЕ
Аргументы arg считаются списками, команда concat объединяет их в один общий список. При этом она удаляет пробелы в начале и конце arg, и вставляет по одному пробелу между ними. Команда допускает произвольное число аргументов. Например, команда
concat a b {c d e} {f {g h}} возвращает списокa b c d e f {g h}
Если не задано никаких аргументов, то команда возвращает пустую строку.
СИНТАКСИСКоманда continue прекращает выполнение текущего шага цикла.
continue
continueОПИСАНИЕ
Обычно данная команда помещается внутрь цикла, например, созданного командами for, foreach или while. Команда возвращает код TCL_CONTINUE, который вызывает завершение текущей итерации наименьшего охватывающего ее цикла. Управление возвращается команде цикла, которая начинает следующий шаг цикла. Код TCL_CONTINUE обрабатывается также в некоторых других ситуациях — при исполнении команды catch и в скрипте самого верхнего уровня.
СИНТАКСИСКоманда проверяет в канале условие конца файла.
eof
eof channelIdОПИСАНИЕ
Команда eof возвращает ‘1’, если во время последней операции ввода в канале channelId произошло условие конца файла, и 0 — в противном случае.
СИНТАКСИСКоманда генерирует ошибку.
error
error message?info??code?ОПИСАНИЕ
Команда возвращает код TCL_ERROR, прерывающий интерпретацию команды. Строка message возвращается приложению, чтобы указать, что именно произошло.Если задан непустой аргумент info, его значение присваивается глобальной переменной errorInfo.
Переменная errorInfo обычно используется для формирования сведений о вложениях команды, в которой произошла ошибка. Другими словами, как только оказывается, что невыполненная команда была вложена в другую команду, информацию об этой команде добавляется к errorInfo. Если же аргумент info был задан, этого не происходит. Эта особенность позволяет при использовании команды error совместно с командой catch выдать информацию о реальном месте ошибки (а не о месте вызова команды error). Дляэтого можно использовать следующую конструкцию:
Если задан аргумент code, то его значение будет присвоено глобальной переменной errorCode. Эта переменная предназначена для хранения машинного описания ошибки в тех случаях, когда такое описание возможно. Форматы различных сообщений приведены в разделе tell. Если аргумент не задан, переменной errorCode в процессе обработки Tcl-интерпретатором ошибки, порожденной командой, присваивается значение ``NONE''.catch {...} errMsg
set savedInfo $errorInfo
...
error $errMsg $savedInfo
exec
Команда запускает подпроцессы.СИНТАКСИС
Если первые аргументы команды начинаются со знака '-', они считаются ключами команды, а не частью описания конвейера.
Возможные ключи:
- — отмечает конец ключей. Аргумент, следующий за этим ключом, рассматривается как первый аргумент arg, даже если он начинается со знака '-'.
| — разделяет команды в конвейере. Стандартный вывод предыдущей команды направляется на стандартный вход следующей команды.
|& — разделяет команды в конвейере. Стандартный вывод и стандартный вывод ошибок предыдущей команды направляются на стандартный вход следующей команды. Такое выражение перебивает выражения типа ‘2>’ и ‘>&’.
< fileName — файл fileName отрывается и используется как стандартный ввод для первой команды конвейера.
<@ fileId — в этой форме fileId это идентификатор файла, открытого с помощью команды open. Он используется как стандартный ввод для первой команды конвейера. Файл должен быть открыт для чтения.
<< value — value используется как стандартный ввод для первой команды конвейера.
> fileName — Стандартный вывод последней команды перенаправляется в файл fileName и перезаписывает его содержимое.
2> fileName — Стандартный вывод ошибок всех команд в конвейере перенаправляется в файл fileName и перезаписывает его содержимое.
>& fileName — Стандартный вывод последней команды и стандартный вывод ошибок всех команд в конвейере перенаправляется в файл fileName и перезаписывает его содержимое.
>>fileName — Стандартный вывод последней команды перенаправляется в файл fileName и добавляется к его прежнему содержимому.
>@ fileId — в этой форме fileId это идентификатор файла,
открытого с помощью команды open.
Стандартный вывод последней команды перенаправляется в файл fileName и
перезаписывает его содержимое. Файл должен быть открыт для записи.
>&@ fileId- в этой форме fileId это идентификатор
файла, открытого с помощью команды open.
Стандартный вывод последней команды и стандартный вывод ошибок всех команд в
конвейере перенаправляется в файл fileName и перезаписывает его
содержимое. Файл должен быть открыт для записи.
Если стандартный вывод последней команды конвейера не был перенаправлен, то команда exec возвращает его значение. Если одна из команд конвейера вернула код ошибки, была прервана или приостановлена, то команда exec вернет код ошибки. При этом сообщение об ошибке будет включать стандартный вывод конвейера и сообщение об ошибке. В переменной errorCode будет записана дополнительная информация о последней встреченной ошибке. Если хотя бы одна из команд конвейера пишет информацию об ошибках в файл и стандартный вывод ошибок не перенаправлен, команда exec вернет ошибку, сообщение об ошибке будет включать в себя стандартный вывод конвейера, дополненный сообщениями об ошибках (если их было несколько) и стандартным выводом ошибок.
Если последний символ результата исполнения конвейера или сообщения об ошибке
— перевод каретки, то он будет удален из результата или сообщения
соответственно. Это соответствует общему правилу Tcl, по которому возвращаемая
величина, как правило, не оканчивается символом перевода каретки. Однако, если
указана опция -keepnewline, символ перевода каретки в конце
сохраняется.
Если стандартный ввод конвейера не перенаправлен с помощью
символов ``<'', ``<<'' или ``<@'', стандартный ввод в первую команду
конвейера осуществляется со стандартного ввода приложения.
Если последним
аргументом конвейера является '&', конвейер выполняется в фоновом режиме. В
этом случае команда exec возвращает список идентификаторов всех процессов
конвейера. Стандартный вывод последней команды конвейера, если он не
перенаправлен, выводится на стандартный вывод приложения. Стандартный вывод
ошибок, если он не перенаправлен, осуществляется в стандартный вывод ошибок
приложения.
Первое слово в каждой команде считается именем команды. В нем выполняются тильда — подстановки. Если получившийся при этом результат не содержит слешей, соответствующая команда ищется в каталогах, перечисленных в переменной окружения PATH. Если имя команды после подстановок содержит слеши, оно должно указывать на исполняемый файл, доступный из текущего каталога. Никакие другие подстановки в командах, например, принятые в shell подстановки ‘*’ и '?', не выполняются.
Выражения в Tcl отличаются от выражений в С способом описания операндов.
Кроме того, Tcl-выражения поддерживают нечисловые операнды и сравнение строк.
Операнды могут быть заданы одним из следующих способов:
В качестве примеров рассмотрим простые выражения, в которых переменная a имеет значение '3', а значение переменной b есть '6'. Тогда выражение в левой части каждой строки даст значение в ее правой части:
| 3.1 + $a | 6.1 |