Из Tcl/Tk
For Programmers http://www.MapFree.com/sbf/tcl/book/home.html |
|
Задания |
Решения |
2.5а Фигурные скобки |
2.5а Фигурные скобки |
Запишите команду Tcl, которая присваивает переменной X строку "Hello World" (без кавычек). |
set X {Hello World} |
2.5b Фигурные скобки |
2.5b Фигурные скобки |
Какие значения приобретут X, Y и Z после выполнения следующих операций? set X 2 set Y {$X} set Z VAR-{$X} Особенность этого примера заключается в том, что у команды set может быть только 2 аргумента - в данном случае "Z" и "VAR-{$X}" |
X является строкой символов, содержащей значение 2 (алфавитно-цифровой символ, не цифра). Y становится строкой, содержащей
символ "$", за которым следует символ “X”. Почему? Т.к
фигурные скобки являются более приоритетными и отменяют действие по взятию
значения переменной X знака $. Процедура set не выполняет никакой дополнительной операции, а только
присваивает переменной Y последовательности символов,
заключенных в {}. Z принимает в качестве значения
строку "VAR-{2}" Почему? Фигурные скобки не окружают полностью аргумент для set, поэтому срабатывает эффект подстановки и вместо $Х, в строку вставляется значение, которое до этого было присвоено переменной X. |
2.6а Двойные кавычки |
2.6а Двойные кавычки |
Что Вы увидите на экране? set X Hello puts {$X World} puts "$X World" puts {{Hello} {World}} puts " {Hello} {World} " |
$Х World Hello World {Hello} {World} {Hello} {World} |
2.7b Командная подстановка |
2.7b Командная подстановка |
1. Пусть Z присвоено значение 2. Опишите подстановки при
выполнении следующих команд. set X [set Y $Z] Обратите особое внимание на
то, когда происходит собственно подстановка. 2. Используя механизм командной подстановки, завершите команду: set Z... таким образом, чтобы Z содержал строку, которая состояла бы из того, что есть в переменной X, за чем следовала бы подстрока символов " ext" (без кавычек). |
1. В командной строке прежде всего выполняется подстановка, следовательно прежде всего будет выполнено set Y $Z Подстановки должны быть
выполнены и закончены в начальной фазе исполнения этой команды. За счет
подстановки, реально команда будет иметь вид: set Y 2 Далее выполняется командная подстановка, в результате которой возвращается значение выполнения вышеприведенной команды, то есть, 2. За счет выполнения командной подстановки результирующая команда будет приведена к виду: setX2 и результат выполнения уже такой команды будет передан далее. 2.set Z [set X]_ext |
2.8а Открытие Файлов |
2.8а Открытие Файлов |
Предположим, переменные InputFileName и OutputFileName
содержат имена входного и выходного файлов соответственно. Используйте эти
переменные вместо имен файлов для команд открытия файлов. |
set InFile [open $InputFileName
r] set OutFile [open $OutputFileName
w] В Tcl также имеется
процедура закрытия файлов, например, следующие команды
будут закрывать файлы, открытые предыдущими командами: close $InFile close $OutFile |
2.9а Завершенный пример копирования файлов |
2.9a Завершенный пример
копирования файлов |
Напишите пример копирования со
стандартного входа в стандартный выход. |
#!/usr/local/bin/tclsh while {-1 != [gets stdin Line]} { puts $Line } |
2.9b
Завершенный пример копирования файлов |
2.9b Завершенный пример
копирования файлов |
Если Вы введете в качестве
строки ввода только лишь символ 0, оператор цикла while "O==[gets stdin]" "puts
{another line} " будет останавливаться, не
печатая ничего. Почему? А если Вы
введете в качестве строки ввода символ 1, тот же самый оператор цикла будет
печатать строки "another line". Почему? |
Когда оператор цикла while срабатывает, оператор gets
получает входную строку и передает ее для обработки в
оператор цикла. Если эта строка содержит 0, вычисление условия исполнения
цикла приведет к остановке цикла. Если строка, переданная оператором get, содержит любое другое значение, цикл продолжит
выполнение. Чтение входного значения и его проверка производятся до того, как выполняется тело оператора цикла. Для сравнения, рассмотри выполнение двух операторов цикла: while "1==1" "puts {another line}
" и while "0==l" "puts {another line}
" В первом случае оператор while остановится немедленно, в то время как во втором случае мы получим бесконечный цикл без возврата к чтению нового вводимого входного значения. Вот причина того, что выражение 0==[gets stdin] не перевычисляется, как этого стоило бы ожидать, так как имеет место командная подстановка. Для того, чтобы процедура цикла while выполняла подстановку в начале каждой
итерации, используйте фигурные скобки. |
|
|
Script S2.9a: Пример: Копирование Файлов. |
#!/usr/local/bin/tclsh # This is script S2.9a of # "Tcl/Tk For Programmers" set InFile [open inputtxt
r] set OutFile [open output.txt w] while {-1 != [gets SInFile Line]} { puts $OutFile $Line } |
2.10а Дополнительно о Подстановках |
2.10a Дополнительно о
Подстановках |
Что будет выведено в случае
выполнения каждого из операторов put? set X Zip puts"\"" puts {\”} puts \$X puts" [set X]{$X}!" puts {[set X]"$X"} puts "\ HI" puts {\ HI} puts "\44" puts {\44} puts one{\44}more\ \} puts one{\44}more} set X 1; while {$X} "puts \44X; set X 0" |
set X Zip %puts"\"" ” В результате будут напечатаны
одиночный символ двойных кавычек, поскольку символ «обратный слэш» экранирует специальное значение одного следующего
за ним символа двойных кавычек, который в неэкранированном случае выполнял бы
роль ограничителя строки вывода оператора put. % puts {\”} \" В данном
случае строка вывода содержит обратный слэш и один
символ двойных кавычек, поскольку экранирующее действие обратного слэша подавлено более приоритетными фигурными скобками. % puts \$Х $Х Будет
выведено два символа: $Х, поскольку символ обратного слэша,
стоящий непосредственно перед символом цены ("доллар") в данном
случае "экранирует" подстановку, которая ожидается
в строке $Х. Подстановки не производится. % puts "[set X]{$X}!"
Zip{Zip}! В данном
случае имеет место как подстановка переменно, так и командная подстановка.
Отметьте, что аргумент ограничен не парой символов {}, а
парой двойных кавычек. % puts {[set X]"$X"} [setX]"$X" % puts "\ HI" HI % puts {\ HI} HI % puts "\44" $ поскольку 44
это восьмеричный код символа "$." % puts {\44} \44 поскольку
реально подстановки никакой нет. % puts one{\44}more\ \} one{$}more} Подстановка
при использовании обратного слэша происходит три
раза. % puts one{\44}more } А вот тут будет зафиксирована ошибка, поскольку вторая фигурная
закрывающая скобка ( } ) будет восприниматься в качестве второго аргумента
команды put,
a в таком случае первый аргумент - строка
символов one{$}more уже считается ссылкой на файл. Скорее всего, такой ссылки до этого
никто не предусмотрел. % set X 1; while {$X} "puts \44X; set X 1 Трюк.
Подстановка "\44" в "$" будет произведена до того, как какие либо значения будут
переданы в качестве аргумента оператору цикла while. А сам оператор while в каждой из итераций потом будет
выполнять свои собственные подстановки, вот почему только одна (первая)
итерация произведет подстановку $Х на 1. Старательно
избегайте использования операторов while и if без фигурных
скобок! Если Вам требуется еще "урок", спросите-ка сами себя, к
чему может привести такое "бесфигурноскобочное"
использование цикла while: set XI; while $X "puts \44X; set X 0" |