Уроки Tcl

Начало Уроки Tk Файлы
Статьи Уроки Tcl Гостевая книга
Предыдущий урок - #17: Подкоманды string - length index range

#18: Сравнение строк - compare match first last wordend

Часто выполняемые над строками операции включают поиск по шаблону, или сравнение одной строки с другой, они будут рассмотрены в этом уроке.

Tcl обладает несколькими способами для поиска в строке. Подкомманды first и last возвращают первую и последнюю позицию подстроки в строке.

Команда match проверяет на строки шаблону. В ней используются такие же правила globbing, как и в команде lsearch.

Команда string compare проверяет, какая строка идёт раньше по алфавитному порядку.

Вот описание этих команд:

string compare строка1 строка2
    Сравнивает строку1 со строкой2 и возвращает:
  • -1 ... если строка1 меньше строки2
  • 0 ... если строка1 равна строке2
  • 1 ... если строка1 больше, чем строка2
string first строка1 строка2
  Возвращает номер символа в строке1, с которой начинается первое соответствие строке2, или -1 если нет соответствия строке2 в строке1.
string last строка1 строка2
  Возвращает номер символа в строке1, с которой начинается последнее соответствие строке2, или -1 если нет соответствия строке2 в строке1.
string wordend строка индекс
  Возвращает позицию символа сразу после последнего символа слова, на которое указывает индекс в строке. Слово - любая последовательность последовательность букв, цифр или символов подчеркивания, а так же одиночный символ.
string match образец строка
  Возвращает 1 если шаблон соответствует строке. Шаблон задаётся в стиле glob.

Globbing - система шаблонов, аналогичная используемой в файловой системе. Шаблоны globbing бывают следующими:

*Соответствует любому количеству символов.
lsearch $list a*
возвратит номер первого элемента списка, который начинается с буквы 'a', независимо от следующих.
?Соответствует любому символу
lsearch $list a?
возвратит индекс первого элемента списка, который начинается с буквы 'a', и имеет только один символ после 'a'.
\XОбратная дробь отменяет действие специального символа, так же как и при подстановке в Tcl. Использование обратной дроби позволяет искать символы '*' и '?'.
lsearch $list a\*
возвратит номер элемента списка равного "a*".
[...]Соответствует любому символу, из перечисленных в квадратных скобках. Например, [А-Я] соответствует любой заглавной букве.
lsearch $list [0-9]*
возвратит номер первого элемента, начинающегося с цифры.

В примере first и last используются чтобы найти первый и последний слэш (знак деления - /) в строке, содержащей путь к файлу. Если первый символ пути - "/", то это абсолютный путь, иначе - относительный. Это верно только для файловой системы Unix-подобных систем.

В последней части кода первая буква сравнивается с буквой "a", так как по порядку символов в компьютере идут цифры от 0 до 9, затем A-Z, а потом a-z. Потом идут русские буквы А-Я и а-я. Поэтому при сравнении с "a" можно определить регистр буквы. Это самый простой способ.

Попробуйте изменить пример, и использовать команду split для разделения пути к файлу на раздельные элементы.

Пример:

set fullpath "/usr/home/clif/TCL_STUFF/TclTutor/Lsn.17"
set relativepath "CVS/Entries"
set directorypath "/usr/bin/"

set paths [list $fullpath $relativepath $directorypath]

foreach path $paths  {
	set first [string first "/" $path];
	set last [string last "/" $path];

	;# Сообщение о том, абсолютный путь или относительный

	if {$first != 0} {
		puts "$path - это относительный путь"
	} else {
		puts "$path - это абсолютный путь"
	}

  ;# Если "/" не последний символ в $path, выделить последнее слово.
  ;# иначе, удалить последний символ "/", и найти предпоследний "/", и
  ;# выделить последнее слово.

	incr last;
	if {$last != [string length $path]} {
		set name [string range $path $last end];
		puts "Путь - $path, имя файла - $name"
    } else {
		incr last -2;
		set tmp [string range $path 0 $last];
		set last [string last "/" $tmp];
		incr last;
		set name [string range $tmp $last end]
		puts "последняя папка в пути $path, это $name"
	}

  ;# CVS это папка созданная программой CVS

	if {[string match "*CVS*" $path]} {
		puts "$path - это часть системы контроля версий исходного кода CVS"
	}

  ;# Сравнение с буквой "а" для выяснения, большой или маленкий первый символ
	set comparison [string  compare $name "a"]
	if {$comparison >= 0} {
		puts "$name начинается с маленькой буквы\n"
	} else {
		puts "$name начинается с большой буквы\n"
	}
}

Следующий урок - #19: Обработка строк - tolower toupper trim format
Горбачев "Yurez" Юрий  
Хостинг от uCoz