Из 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 0”

1

 

Трюк. Подстановка "\44" в "$" будет произведена до того, как какие либо значения будут переданы в качестве аргумента оператору цикла while. А сам оператор while в каждой из итераций потом будет выполнять свои собственные подстановки, вот почему только одна (первая) итерация произведет подстановку $Х на 1.

 

 

Старательно избегайте использования операторов while и if без фигурных скобок! Если Вам требуется еще "урок", спросите-ка сами себя, к чему может привести такое "бесфигурноскобочное" использование цикла while:

 

set XI; while $X "puts \44X; set X 0"

 

 

 

Hosted by uCoz