Как выполнять процедуры и можно ли включать макросы в скрипт tcl - PullRequest
0 голосов
/ 05 апреля 2011

Сегодня я встретил в профиле следующую программу ....... хорошая, написанная с большим интеллектом .... однако я не смог ее запустить .......

proc parseFileContents {contents infoVar} { 
    upvar 1 $infoVar inf 
    set lineNum 0 
    foreach line [split $contents "\n"] {  
       incr lineNum         # Skip comment lines (?) 
       if {[string match {$*} $line} continue         # Skip blank lines 
       if {[string trim $line] eq ""} continue        # Parse a "real" line    
       if {[scan $line "%s%s%s%s%s%s%f%f%s%s" a b c name d e value f g h] == 10} {             
           set inf($name) $value
       } else { 
           # Oh dear, didn't work!
           puts "warning: did not understand line $lineNum\n$line"
       }
    } 
} 

Использование:

parseFileContents $theContentsOfTheFile data 
puts "Keys: [array names data]" 
puts "VSS: $data(vss)" puts "VCC: $data(vcc)"

Ответы [ 2 ]

2 голосов
/ 05 апреля 2011

Также убедитесь, что в

if {[string match {$*} $line}

отсутствует закрывающая скобка

if {[string match {$*} $line]}

Окончательный код должен быть таким.

proc parseFileContents {contents infoVar} { 
    upvar 1 $infoVar inf 
    set lineNum 0 
    foreach line [split $contents "\n"] {  
       incr lineNum;         # Skip comment lines (?) 
       if {[string match {$*} $line]} continue;         # Skip blank lines 
       if {[string trim $line] eq ""} continue;        # Parse a "real" line    
       if {[scan $line "%s%s%s%s%s%s%f%f%s%s" a b c name d e value f g h] == 10} {             
           set inf($name) $value
       } else { 
           # Oh dear, didn't work!
           puts "warning: did not understand line $lineNum\n$line"
       }
    } 
}

Если по-прежнему не удается, скопируйте файл содержимого.Помните, что «infoVar» должен быть именем существующего массива.

2 голосов
/ 05 апреля 2011

Мне кажется, проблема в том, что в конце строк нет ; с комментариями (#). Tcl использует либо перевод строки, либо полуколонну в качестве разделителя строк, а комментарии сами по себе являются строкой. попробуйте использовать это вместо:

proc parseFileContents {contents infoVar} { 
    upvar 1 $infoVar inf 
    set lineNum 0 
    foreach line [split $contents "\n"] {  
       incr lineNum;         # Skip comment lines (?) 
       if {[string match {$*} $line]} continue;         # Skip blank lines 
       if {[string trim $line] eq ""} continue;        # Parse a "real" line    
       if {[scan $line "%s%s%s%s%s%s%f%f%s%s" a b c name d e value f g h] == 10} {             
           set inf($name) $value
       } else { 
           # Oh dear, didn't work!
           puts "warning: did not understand line $lineNum\n$line"
       }
    } 
} 

Обратите внимание, что я не тестировал этот новый код, только исправил синтаксические ошибки ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...