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