我正在研究一个mysql select和insert脚本,但是我遇到了将一行提取为两个变量的问题。
该行作为变量$ arg传递,由以下组成:“text field 1 = text field 2” 我试图通过regexp将$ arg拆分为使用“=”作为分隔符进入$ arg1和$ arg2,但我总是将整行解析为$ arg2且$ arg1为空。
regexp -- {(\S+)=(\S+)} $arg null $arg1 $arg2
我尝试了几种使用regexp和更改分隔符的方法但结果仍然相同。 它是用tcl v8.5完成的。
我对tcl不是很熟悉所以我怀疑这主要是由于对tcl / tk的理解滞后。
答案 0 :(得分:1)
使用变量的名称,而不是变量值本身:
regexp -- {(\S+)=(\S+)} $arg null arg1 arg2
如果你使用$var1
,它将在调用命令之前被该变量的值替换,此时命令不知道已经使用了什么变量。
答案 1 :(得分:1)
您也可以使用split
替代:
% set results [split $arg "="]
它为您提供了一个包含您正在寻找的两个部分的列表。
然后您可以使用lindex
来引用每个元素。
% puts [lindex $results 0]
text field 1
% puts [lindex $results 1]
text field 2
或者如果您想将它们存储在变量arg1
和arg2
中,您可以使用lassign
:
% lassign $results arg1 arg2
% puts $arg1
text field 1
% puts $arg2
text field 2
答案 2 :(得分:1)
在解析这些事情时,您应该注意只匹配完全您期望的内容。 (您需要记住,无论何时使用Tcl分配变量,都需要提供变量的名称 - arg1
- 而不是内容变量的分析 - $arg1
。)
regexp -- {([^\s=])=(\S+)} $arg null arg1 arg2
您还应该检查regexp
来电的结果,看看RE是否匹配。