错误:无法读取" line2":tcl中没有这样的变量

时间:2014-07-01 13:33:58

标签: tcl puts

我有一个包含此代码段的脚本:

 while {[gets $fin line] != -1} {
 if {[string first "Modem :" $line] != -1} {
            set line2 [string range $line 17 end]
            puts $fout "One : \t$line2"
    }

    puts $fout "Two : \t$line2"
 }

One :有效并打印输出(当我不在脚本中包含Two :部分时),但当我加入Two :时,会显示

error : can't read "line2": no such variable
    while executing
"puts $fout "Two : \t$line2""
    ("while" body line 14)

line2退出后,它是否保持if的价值?

2 个答案:

答案 0 :(得分:1)

通过聊天,this$fin的示例。

代码的问题是while {[gets $fin line] != -1}一次遍历$fin的每一行,而不是一堆。 read是将所有行放在一个变量中的命令。

这意味着当读取第一行时,您在循环的第一次迭代中没有$line1$line2,因此puts将无法检索这些名称的变量。

我建议的解决方案是首先获取所需的每个变量,然后在为'块收集所有内容时,立即打印所有变量。

set fin [open imp_info r]
set fout [open imfp_table w]

puts $fout "LINK\tModem Status"
puts $fout "----\t------------"

while {[gets $fin line] != -1} {

        # If there is "wire-pair (X)" in the line, get that number
        regexp -- {wire-pair \(([0-9]+)\)} $line - wire_pair_no

        # Last column, get the value and puts everything
        if {[regexp -- {Modem status: ([^,]+)} $line - status]} {
               puts $fout "$wire_pair_no\t$status"
        }

}

输出:

LINK    Modem Status    
----    ------------
0       UP_DATA_MODE
1       UP_DATA_MODE

答案 1 :(得分:0)

如果您在此循环中读到第一行:

while {[gets $fin line] != -1} {
    if {[string first "Modem :" $line] != -1} {
        set line2 [string range $line 17 end]
        puts $fout "One : \t$line2"
    }
    puts $fout "Two : \t$line2"
}

你的某个地方没有“Modem :”,条件不满足,处理if时未触及变量。以下puts失败,因为line2变量尚未设置为任何内容;那里没有变量,$语法完全不喜欢它。

一种可能的解决方法是在循环开始之前将line2设置为某些内容:

set line2 "DUMMY VALUE"

或许您应该将您在那里阅读的变量更改为line而不是line2

puts $fout "Two : \t$line"

或许您应该在阅读之前测试变量是否存在:

if {[info exists line2]} {
    puts $fout "Two : \t$line2"
}

一切都会奏效,但他们会做不同的事情,我不知道你想要什么......