从Tcl运行其他程序读取文件

时间:2014-09-24 13:57:08

标签: io tcl

我用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 }

}

2 个答案:

答案 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 ;]