Уроки Tcl
#18: Сравнение строк - compare match first last wordend |
Часто выполняемые над строками операции включают поиск по шаблону, или сравнение одной строки с другой, они будут рассмотрены в этом уроке.
Tcl обладает несколькими способами для поиска в строке. Подкомманды first и last возвращают первую и последнюю позицию подстроки в строке.
Команда match проверяет на строки шаблону. В ней используются такие же правила globbing, как и в команде lsearch.
Команда string compare проверяет, какая строка идёт раньше по алфавитному порядку.
Вот описание этих команд:
| string compare строка1 строка2 | |
Сравнивает строку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"
}
}
|
| Горбачев "Yurez" Юрий |