Tcl 映射后如何写入输出文件(全局)

Tcl 映射后如何写入输出文件(全局),tcl,Tcl,我在tcl中尝试了一个程序,将mstate.txt中的id号映射为instit.map.gz中的名称,并将名称打印到另一个名为file.txt的文件中 但问题是如何将fp3声明为全局变量。因为每次调用过程时,file.txt文件都被重写了,这是我不想要的 set fp2 [open mstate.txt r] set fp3 [open file.txt w] proc mapping {n} { set b [lindex $n 0] set pipeline [open "

我在tcl中尝试了一个程序,将mstate.txt中的id号映射为instit.map.gz中的名称,并将名称打印到另一个名为file.txt的文件中 但问题是如何将fp3声明为全局变量。因为每次调用过程时,file.txt文件都被重写了,这是我不想要的

set fp2 [open mstate.txt r]
set fp3 [open file.txt w]

proc mapping {n} {
    set b [lindex $n 0]
    set pipeline [open "| zcat  instID.map.gz"]
    set file_data [read $pipeline]
    set data [split $file_data "\n"]
    foreach line1 $data {
        set column2 [lindex $line1 1]
        set column1 [lindex $line1 0]

        if {[string equal $column2 $b]} {
            puts $fp3 " $column1   [lrange $n 2 end] "
        }
    }
}

while {[gets $fp2 line] >=0} {
    mapping $line
}
close $fp2
close $fp3

我不太确定我是否完全理解您的问题,但要在Tcl命令中使用全局变量,您需要使用
global
命令:

proc mapping {n} {
    global fp3
    ...

您可以将fp3作为第二个参数传递并在内部访问它。无需将其设置为全局变量

set fp2 [open mstate.txt r]
set fp3 [open file.txt w]

proc mapping {n fp3} {
    set b [lindex $n 0]
    set pipeline [open "| zcat  instID.map.gz"]
    set file_data [read $pipeline]
    set data [split $file_data "\n"]
    foreach line1 $data {
        set column2 [lindex $line1 1]
        set column1 [lindex $line1 0]

        if {[string equal $column2 $b]} {
            puts $fp3 " $column1   [lrange $n 2 end] "
        }
    }
}

while {[gets $fp2 line] >=0} {
    mapping $line $fp3
}
close $fp2
close $fp3

这是正确的,不过在这种情况下,我可能更愿意将频道作为一个参数传递出去。@DonalFellows:我也是,但OP似乎要求这样的东西。