tcl - объяснение следующих команд regexp и regsub
Итак, эксперт tcl здесь (Брэд Ланам) написал следующие команды regexp и regsub в сценарии tcl для анализа моего формата файла (называемого liberty (.lib), используемого в дизайне чипов). Я просто хочу знать, что они имеют в виду (если нет, почему они использовались, поскольку у вас нет контекста). Я использовал ссылки на tcl wiki, но просто не могу связать точки. Вот фрагмент его кода
set fh [open z.lib r]
set inval false
while { [gets $fh line] >= 0 } {
if { [regexp {\);} $line] } {
set inval false
}
if { [regexp {index_(\d+)} $line all idx] } {
regsub {^[^"]*"} $line {} d
regsub {".*} $d {} d
regsub -all {,} $d {} d
dict set risedata constraints indexes $idx $d
}
if { $inval } {
regsub {^[^"]*"} $line {} d
regsub {".*} $d {} d
regsub -all {[ ,]+} $d { } d
set row [expr {$rcount % 5}]
set column [expr {$rcount / 5}]
set i 0
foreach {v} [split $d { }] {
set c [lindex [dict get $risedata constraints indexes 3] $i]
dict set risedata constraints constraint $c $row $column $v
incr i
}
incr rcount
}
if { [regexp {values} $line] } {
set inval true
set row 0
set rcount 0
}
}
close $fh
Особенно, что делает
if { [regexp {index_(\d+)} $line all idx] } {
regsub {^[^"]*"} $line {} d
regsub {".*} $d {} d
regsub -all {,} $d {} d
Имею в виду?? строка, содержащая \d+, ищет переменную строки для более чем одной цифры и совпадает со строкой строки? Что такое regsub {^[^"]*"} $line {} d
?
Большое спасибо за помощь нубу, как я понимаю.
Ссылка: Брэд Ланам
1 ответ
Я возьму это построчно и объясню, что это делает.
if { [regexp {index_(\d+)} $line all idx] } {
Эта первая строка проверяет, хранится ли строка в line
включает подстроку index_
следуют 1 или более цифр. Если это так, он сохраняет соответствующую подстроку в all
(который остальная часть кода, кажется, игнорирует) и сохраняет цифры, найденные в переменной idx
,
Так что если line
были установлены на "stuff index_123 more stuff"
, вы бы в конечном итоге all
установлен в index_123
а также idx
установлен в 123
,
regsub {^[^"]*"} $line {} d
это regsub
удалит все с начала line
вплоть до первой двойной кавычки. Сохраняет результат в d
,
regsub {".*} $d {} d
Следующий regsub
действует на значение в настоящее время в d
, Он ищет двойные кавычки и удаляет этот символ и все остальное, сохраняя результат снова в d
,
regsub -all {,} $d {} d
Наконец, эта строка удаляет все запятые, найденные в d
, сохраняя результат обратно в d
,
Следующий набор regexp
/regsub
Строки выполняют аналогичный набор операций, за исключением последней строки в группе:
regsub -all {[ ,]+} $d { } d
После того, как предыдущие строки удалили все, кроме раздела, который был в двойных кавычках, эта строка удаляет все разделы, состоящие из одного или нескольких пробелов и запятых, и заменяет их одним пробелом.
Дайте мне знать, если это ясно.