2011-04-05 20 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

相关问题