2011-04-05 47 views
0

我今天在配置文件中遇到以下程序.......它是一個用偉大的智慧編寫的好程序....但是我沒有能力運行它.......如何執行程序,並可以將宏包含在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" 
     } 
    } 
} 

使用它:

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

「我無法運行它」是什麼意思?有沒有錯誤信息? '$ theContentsOfTheFile'的內容是什麼? – bmk 2011-04-05 09:36:22

+0

我發現很難執行它 – Naaz 2011-04-11 05:35:27

回答

2

我相信這個問題是不存在;在線條與他們意見(#)結束。 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" 
     } 
    } 
} 

請注意,我沒有測試這個新的代碼,只有固定的語法錯誤......

+1

...除了'字符串匹配行'上的缺失括號 – 2011-04-05 14:32:43

+0

@glen,固定。 TY。 – 2011-04-05 17:04:31

2

還要檢查

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」應該是現有數組的名稱。

+0

請注意,glob模式'$ *'不匹配空行,它匹配以美元符號開頭的行。 – 2011-04-05 14:32:09

+0

所有評論都被轉移。我只是懶得修理它們。每條評論都引用了下一行 – 2011-04-05 19:19:19

+0

@Carlos,我的評論確實是針對提問者。 – 2011-04-05 19:20:57

相關問題