在TCL中编辑文件并将修改后的内容添加到文件中 - 2

时间:2015-07-22 07:50:50

标签: tcl

  <?xml version="1.0" encoding="UTF-8"?>
   <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
     <AllowedOrigin>http://localhost:3000</AllowedOrigin>
     <AllowedMethod>GET</AllowedMethod>
     <AllowedMethod>POST</AllowedMethod>
     <AllowedMethod>PUT</AllowedMethod>
     <MaxAgeSeconds>5000</MaxAgeSeconds>
     <AllowedHeader>*</AllowedHeader>
    </CORSRule>
   </CORSConfiguration>

我想操作此输入文件并按如下方式获取输出文件: -

form.save(commit=False)

我在tcl中试过这个,

instance

但它不起作用。这可能是什么问题?

2 个答案:

答案 0 :(得分:1)

执行此操作的最简单方法是使用某些过程,然后将输入文件评估为Tcl脚本,它看起来就像它一样。您可以使用proc命令定义它们。还要记住,全局变量需要在过程中使用global命令显式地进入范围;默认情况下,变量是本地的。

# Initialise the state
set moduleName c1
proc module {name} {
    global module
    set module $name
}

# No regexp to parse this! No need.
proc accent {a b c} {
    global fo module
    chan puts $fo "accord \[get_nets $module/$c] \[get_pins $module/$a/$b]"   
}

请注意,如果您要在那里生成Tcl命令以供以后评估(它看起来像!)那么您正在创建的get_nets调用将“令人惊讶”,因为c1/f[1](例如)在评估命令时,将尝试调用命令1并将其结果替换为结果字。这通常是一个错误。如果这是正在发生的事情,那么在构建输出时需要更加小心。这项工作的list命令完美

proc accent {a b c} {
    global fo module
    # Generate the calls we want to do, without any brackets around it
    set nets_call [list get_nets $module/$c]
    set pins_call [list get_pins $module/$a/$b]
    # I like to put \] instead of ] in these situations, even if it isn't necessary here
    chan puts $fo "accord \[$nets_call\] \[$pins_call\]"   
}

在您的示例中,这实际上会生成:

accord [get_nets {c1/f[1]}] [get_pins c1/a1/Z]     
accord [get_nets {c1/f[2]}] [get_pins c1/a2/C]
accord [get_nets {c2/f[3]}] [get_pins c2/a3/Z]   
accord [get_nets {c2/f[4]}] [get_pins c2/a4/C]

答案 1 :(得分:0)

这只是第三个捕获组中的一个小问题。重写accent条款:

accent {
    if {[regexp {{(\w+)}.+{(\w+)}.+{([][\w]+)}} $line -> a b c]} {
        chan puts $fo "accord \[get_nets $module/$c] \[get_pins $module/$a/$b]"
    }
}

字符转义\w一词不匹配{f[1]}中的括号等。正则表达式片段[][\w]表示&#34;匹配右括号,左括号,或一个单词字符&#34;。它看起来有点令人困惑,因为括号用于两种意义:表示类匹配,并作为字面括号。

请注意,如果您将accord作为Tcl命令运行,则解释器将尝试将1,2,3和4作为命令进行评估,因为它们用括号括起来。

<小时/> 除了回答2015-08-03的后续问题

accent {
    if {[regexp {{(\w+)}.+{([01])}} $line -> a b]} {
        chan puts $fo "create \$mod/tie$b"
    }
}

如果您要使用正则表达式,则需要学习正则表达式语法。如果您要使用Tcl,则需要学习Tcl语法。随后是解释和一些道歉。

您将字符串a1a2与正则表达式[][\w]+匹配,意思是&#34;右括号,左括号或任何单词字符&#34;中的一个或多个; 。如果没有括号,请不要与它们匹配:使用\w+,即&#34;一个或多个单词字符&#34;。

您将字符串10与正则表达式\d[0-1]+.匹配,即&#34;一位数字,然后是0-1&#范围内的一个或多个字符34 ;.除非您提供的示例不具代表性,否则[01]就足够了(&#34;匹配一个0或1&#34的字符)。

这很重要,因为正则表达式匹配是将自己的脚射向血腥破烂的绝佳工具。如果你使用它,你需要确定你没有匹配任何你不应该匹配的东西,并且确保你匹配你应该匹配的所有东西。

这当然是假设字符串中的内容非常重要。如果您知道可以构建有效的accord / create /无论哪一行在每个给定的accent行中,跳过正则表达式匹配,只使用Donal Fellows&#39;解。如果您仍想使用switch构造,请删除regexp并使用

之类的代码
accent {
    lassign $line -> a b c
    chan puts $fo "accord \[get_nets $module/$c] \[get_pins $module/$a/$b]"  
}

是的,我知道,在我之前的回答中,我是那个建议RE的人:似乎他们被要求了,但是现在我看到你和他们一起挣扎我开始认为我做了一个专业帮倒忙。 (除非我认为它们绝对必要,否则我通常不推荐使用RE:验证数据就是这样的应用程序。)

哦,如果您想在输出中使用文字$,则需要将其作为\$转义。否则,Tcl解释器会尝试使用名为substring的变量的值替换$和以下子字符串。