我用tcl打开一个shell程序,打开命令,shell输出文件有一些stings和tcl命令。如果该行是一个字符串列表以及如何评估该行是否为tcl命令,可以告诉我如何打印
我使用了以下sytnax,但它也试图执行字符串,
set fileID [open "| unix ../filename_1" r+]
while 1 {
set line [gets $fileID]
puts "Read line: $line"
if {$line == "some_text"} { puts $line #text
} elseif { $line == "cmd"} {set j [eval $line] #eval cmd }
}
答案 0 :(得分:1)
你可以尝试这个(测试过)
原理:测试每一行的第一个单词以查看它是否属于tcl命令列表, 它首先由" info命令"获得。
有时你无法正确获取第一个单词,这就是为什么这个命令在catch {}中。
set fileID [open myfile]
set cmdlist [info commands]
while {1} {
set readLine [gets $fileID]
if { [eof $fileID]} {
break
}
catch {set firstword [lindex $readLine 0] }
if { [lsearch $cmdlist $firstword] != -1 } {
puts "tcl command line : $readLine"
} else {
puts "other line : $readLine"
}
}
答案 1 :(得分:1)
完全归功于abendhurt。将他的答案重写为更惯用的Tcl:
set fid [open myfile]
set commands [info commands]
while {[gets $fid line] != -1} {
set first [lindex [split $line] 0]
if {$first in $commands} {
puts "tcl command line : $line"
} else {
puts "other line : $line"
}
}
注意:
while {[gets ...] != -1}
来减少代码。split
将字符串转换为正确的列表 - 不再需要catch
in
运算符来提高可读性。我想我明白了:
set fid [openopen "| unix ../filename_1" r]
set commands [info commands]
set script [list]
while {[gets $fid line] != -1} {
set first [lindex [split $line] 0]
if {$first in $commands} {
lappend script $line
}
puts $line
}
eval [join $script ;]