TCL如何在内存中存储变量 file1.txt 我的剧本是 问题
我得到的输出是TCL如何在内存中存储变量 file1.txt 我的剧本是 问题,tcl,Tcl,我得到的输出是 % set dut1Loop1Net [::ip::contract [::ip::prefix 1.1.1.1/24]]/24 在这里,我得到的字符串没有计算。 我希望输出为1.1.1.0/24。因为TCL在这里不计算代码,所以它像字符串一样打印 我很想知道TCL如何存储数据以及它将以何种形式检索数据。问题是存储在val中的代码永远不会执行 您可以使用$val访问它,但通过这种方式可以获得代码本身,而不是其执行的结果 要解决此问题,必须确保执行了[::ip::contrac
% set dut1Loop1Net
[::ip::contract [::ip::prefix 1.1.1.1/24]]/24
在这里,我得到的字符串没有计算。我希望输出为
1.1.1.0/24
。因为TCL在这里不计算代码,所以它像字符串一样打印
我很想知道TCL如何存储数据以及它将以何种形式检索数据。问题是存储在
val
中的代码永远不会执行
您可以使用$val
访问它,但通过这种方式可以获得代码本身,而不是其执行的结果
要解决此问题,必须确保执行了[::ip::contract[::ip::prefix 1.1.1.1/24]/24
,您可以通过替换此行来完成此操作
set val [string trim [string range $line1 $mark end]]
用这个
eval "set val [string trim [string range $line1 $mark end]]"
为什么??以下是我的简单解释:
“…”
部分,因此它在其中执行替换字符串范围$line1$mark end
命令string trim…
命令eval
命令准备运行时,就好像您的代码行变为
eval {set val [::ip::contract [::ip::prefix 1.1.1.1/24]]/24}
现在执行eval
命令,它递归调用解释器,因此字符串set val[::ip::contract[::ip::prefix 1.1.1/24]/24
进入另一个替换阶段,最后运行您想要的,并将字符串1.1.1/24
放入变量val
我希望这能有所帮助。问题是存储在
val
中的代码永远不会执行
您可以使用$val
访问它,但通过这种方式可以获得代码本身,而不是其执行的结果
要解决此问题,必须确保执行了[::ip::contract[::ip::prefix 1.1.1.1/24]/24
,您可以通过替换此行来完成此操作
set val [string trim [string range $line1 $mark end]]
用这个
eval "set val [string trim [string range $line1 $mark end]]"
为什么??以下是我的简单解释:
“…”
部分,因此它在其中执行替换字符串范围$line1$mark end
命令string trim…
命令eval
命令准备运行时,就好像您的代码行变为
eval {set val [::ip::contract [::ip::prefix 1.1.1.1/24]]/24}
现在执行eval
命令,它递归调用解释器,因此字符串set val[::ip::contract[::ip::prefix 1.1.1/24]/24
进入另一个替换阶段,最后运行您想要的,并将字符串1.1.1/24
放入变量val
我希望这能有所帮助。Tcl如何存储价值观。
- 短篇故事:
- 长征 Tcl将数据存储在上次使用的数据类型中,仅在nessecary时计算字符串表示,使用写时复制,一种简单的refcount内存管理
# This is a comment
variable = value
othervar = [doStuff]
您可以使用一些技巧让Tcl为您解析它:
rename ::unknown ::_confp_unknown_orig
proc unknown args {
if {[llength $args] == 3 && [lindex $args 1] eq "="} {
# varname = value
uplevel 1 [list set [lindex $args 0] [lindex $args 2]
return [lindex $args 2]
}
# otherwise fallback to the original unknown
uplevel 1 [linsert $args 0 ::_confp_unknown_orig]
# if you are on 8.6, replace the line above with
# tailcall ::_confp_unknown_orig {*}$args
}
# Now just source the file:
source file1.txt
# cleanup - if you like
rename ::unknown {}
rename ::_confp_unknown_orig ::unknown
另一种方法是使用安全的interp,但在这种情况下,使用主interp看起来很好。Tcl如何存储值。
- 短篇故事:
- 长征 Tcl将数据存储在上次使用的数据类型中,仅在nessecary时计算字符串表示,使用写时复制,一种简单的refcount内存管理
# This is a comment
variable = value
othervar = [doStuff]
您可以使用一些技巧让Tcl为您解析它:
rename ::unknown ::_confp_unknown_orig
proc unknown args {
if {[llength $args] == 3 && [lindex $args 1] eq "="} {
# varname = value
uplevel 1 [list set [lindex $args 0] [lindex $args 2]
return [lindex $args 2]
}
# otherwise fallback to the original unknown
uplevel 1 [linsert $args 0 ::_confp_unknown_orig]
# if you are on 8.6, replace the line above with
# tailcall ::_confp_unknown_orig {*}$args
}
# Now just source the file:
source file1.txt
# cleanup - if you like
rename ::unknown {}
rename ::_confp_unknown_orig ::unknown
另一种方法是使用安全的interp,但在这种情况下,使用主interp看起来很好。请注意,命令
::ip::contract[::ip::prefix 1.1.1/24]
提供的是1.1.1
,而不是1.1.1.0
,因此,您的代码应该放在dut1Loop1Net
中的是1.1.1/24
,而不是1.1.1.0/24
注意,命令::ip::contract[::ip::prefix 1.1.1.1/24]
给出的是1.1.1
,而不是1.1.1.1.0
,因此,您的代码应该放在dut1Loop1Net
中的是1.1.1/24
,而不是1.1.1.0/24
谢谢您的回答,但我需要存储的变量如何进入替换(如列表“”或{}或正常值)。你能提供一些好的材料来了解存储在内存中的变量,并知道ot从内存中检索时的形式吗。我知道TCL的概念,但有一些被困在这个问题上。从我在你的问题中看到的,你不需要任何关于TCL内部的知识。请看一下@JohannesKuhn在回答中所写的链接。Tcl变量存储在名为Tcl\u Obj
的C结构中。您可以查看源代码以了解它是如何完成的:并查看tcl.h
谢谢您的回答,但我需要知道存储的变量是如何进入替换的(如列表“”或{}或正常值)。你能提供一些好的材料来了解存储在内存中的变量,并知道ot从内存中检索时的形式吗。我知道TCL的概念,但有一些被困在这个问题上。从我在你的问题中看到的,你不需要任何关于TCL内部的知识。请看一下@JohannesKuhn在回答中所写的链接。Tcl变量存储在名为Tcl\u Obj
的C结构中。您可以查看源代码以了解它是如何完成的:并查看tcl.h