Уроки 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" Юрий |