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

时间:2014-04-30 17:34:16

标签: tcl

我在tcl中尝试了一个程序来映射mstate.txt中的id号,其名称在instID.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

2 个答案:

答案 0 :(得分:1)

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

proc mapping {n} {
    global fp3
    ...

答案 1 :(得分:0)

您可以将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