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

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

Дайте мне знать, если это ясно.

Другие вопросы по тегам