Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TCL、regexp函数和参数替换_Regex_Tcl_Substitution - Fatal编程技术网

TCL、regexp函数和参数替换

TCL、regexp函数和参数替换,regex,tcl,substitution,Regex,Tcl,Substitution,我有下面的代码,试图通过regexp函数将单行上的数据匹配到不同的变量中。 regexp函数中的数据数量(在输入行上)和变量名的数量可能会有所不同,这就是为什么我使用$varLine(以前在我的实际代码中处理过) 当我执行它时,我得到以下错误($sig0正确显示): 如果我手动将$varLine替换为regexp行,错误将消失: set in_stim "13 1 1 0 1 0 0 0 2 03" set regex {^(\d+)\s([01])\s([01])\s([01])\s([01]

我有下面的代码,试图通过regexp函数将单行上的数据匹配到不同的变量中。 regexp函数中的数据数量(在输入行上)和变量名的数量可能会有所不同,这就是为什么我使用$varLine(以前在我的实际代码中处理过)

当我执行它时,我得到以下错误($sig0正确显示):

如果我手动将$varLine替换为regexp行,错误将消失:

set in_stim "13 1 1 0 1 0 0 0 2 03"
set regex {^(\d+)\s([01])\s([01])\s([01])\s([01])\s([01])\s([01])\s([01])\s(\d+)\s(\d+)}
regexp $regex $in_stim whole sig0 sig1 sig2 sig3 sig4 sig5 sig6 sig7 sig8 sig8
puts $sig0
puts $sig1
我得到以下正确的输出:

13
1
有没有人看到我的代码中有错误,或者可以帮忙? 谢谢

当你这样做的时候

set varLine "sig1 sig2 sig3 sig4 sig5 sig6 sig7 sig8 sig8"
regexp $regex $in_stim whole sig0 $varLine
Tcl解析器只传递
regexp
命令五个参数,第五个参数是变量“varLine”的内容,然后
regexp
命令将变量“varLine”作为一个单词处理。一个单词显然表示一个变量(在您的例子中,它的名称有些复杂)

要完成您需要的任务,您必须求助于动态脚本,这可以通过两种方式完成:

  • “经典”方法使用:

  • 使用Tcl 8.5以后的语法:

    regexp $regex $in_stim whole sig0 {*}$varLine
    
  • 经典方法首先通过连接两个列表来构造单词列表:命令的“静态”部分,然后是要传递给它的变量列表。然后将构造的列表作为命令进行评估。您可以在中阅读更多关于此的信息

    在新样式的方法中,使用
    {*}
    thingy将$varLine的内容扩展到一个“就地”列表中-请参阅第5条规则

    set varLine "sig1 sig2 sig3 sig4 sig5 sig6 sig7 sig8 sig8"
    regexp $regex $in_stim whole sig0 $varLine
    
    Tcl解析器只传递
    regexp
    命令五个参数,第五个参数是变量“varLine”的内容,然后
    regexp
    命令将变量“varLine”作为一个单词处理。一个单词显然表示一个变量(在您的例子中,它的名称有些复杂)

    要完成您需要的任务,您必须求助于动态脚本,这可以通过两种方式完成:

  • “经典”方法使用:

  • 使用Tcl 8.5以后的语法:

    regexp $regex $in_stim whole sig0 {*}$varLine
    
  • 经典方法首先通过连接两个列表来构造单词列表:命令的“静态”部分,然后是要传递给它的变量列表。然后将构造的列表作为命令进行评估。您可以在中阅读更多关于此的信息


    在新风格的方法中,使用
    {*}
    thingy将$varLine的内容扩展为一个“就地”列表-请参阅第5条规则。

    问题在于
    regexp
    命令没有将存储子匹配的变量列表作为一个参数,而是将其作为多个参数

    解决此问题的最简单方法是展开变量列表:

    regexp $regex $in_stim whole sig0 {*}$varLine
    

    问题是,
    regexp
    命令没有将存储子匹配的变量列表作为一个参数,而是作为多个参数

    解决此问题的最简单方法是展开变量列表:

    regexp $regex $in_stim whole sig0 {*}$varLine
    

    问题解决了!谢谢kostix!我猜它必须处理
    eval
    指令,但我忘记了列表提示。我读了{*}但不明白,你的链接太完美了!问题解决了!谢谢kostix!我猜它必须处理
    eval
    指令,但我忘记了列表提示。我读了{*}但不明白,你的链接太完美了!