TCL中的序列符号

2021-06-07 05:57:43

这是一个小实用程序,可以扩展范围或套件的图案,它可以用来使用紧凑的诠释来横跨产品范围或一起组合在一起,例如,

0 foo-a 0 foo-b 1 foo-a 1 foo-b 2 foo-a 2 foo-b 3 foo-a 3 foo-b

我想我在这个wiki上看到了这样的其他实用程序,但我在搜索后找到它们。也许我可以' t in右边的表示法?指针或评论非常欢迎!我确信经常解决了这个问题。标题可能也可以使用一些工作。

我有一个测试程序,我需要运行大量的测试。串联中的每个测试参数都可以通过扩展范围或值集来产生。例如。

测试-size 1测试-size 2测试-size 3测试-size 10测试-size 20测试-size 30测试-size 100 ......

模式需要进行3000000.让' s定义并首先解决更简单的问题。如果我想指定一个简单的整数范围,该怎么办?例如,1 2 3 4 5.对于这种类型的简单范围,我们将使用符号[1-5]。到目前为止。

下一个逻辑步骤:如果我们想递增1以外的数字,怎么办?例如。奇数从1到(包括)7.表示法:[1-7〜2]。

但是在上面的测试调用中,我可以' t只使用简单的范围增量。我需要对数展开。我们可以通过在一个图案中允许多个范围,加上TCL expr'' e'为简单起见,如果有多种模式,它们将从左右扩展。如果您喜欢其他订单,我' d建议可能会更改每个模式上的最后一个匹配的代码,或者只是lsort -dictionary结果的扩展列表。

1e1 = 10.0 2e1 = 20.0 3e1 = 30.0 1e2 = 100.0 2e2 = 200.0 3e2 = 300.0 ... 3e7 = 3000000

到目前为止再次好。现在,一个新的要求。一些参数是字母或单词的集,但否则应类似地操作到上面的整数范围。例如。版本号1到3,带有a或b的后缀。新语法:{A,B}。模式:[1-3] {a,b}展开:

由于我们的左右扩展的政策,这种模式产生的顺序可能不需要,例如,例如,2a遵循1a,其中一些目的应该是遵循1a的1b。让' s保存另一天的问题。

接下来,如果我想在一个图案内有几个不同的子模式,例如,该怎么办,例如,对于软件版本3,应该有后缀A,B和C,但对于版本1和2,只有一个。模式:[1-2] A + 3 {A,B,C}

好的,所以现在我的问题非常解决。对于我曾经接受整数的任何测试参数,我现在允许扩展。因此,我可以使用简短的规格来定位一个大的参数空间,例如,

测试 - 转化1A -SIZE 1E1测试 - 转化2A -SIZE 1E1测试 - 转化3A -SIZE1E1 ...

## seq_expand:展开序列,从范围或集合。#拍摄模式并返回扩展列表。#1.2 ##范围扩展#eg#[1-5] = 1 2 3 4 5#[1-9〜 2] = 1 3 5 7 9#[1-3] e [1-4] = 1 2 3 10 20 30 100 200 300 ##设置扩展#EG#{1,2,3} 05 {3,2} = 1053 1052 2053 2052 ##替代扩展#eg#{a,b} + [1-3] = ab 1 2 3 ## taveats:#范围Don&#39; t支持小数#proc expand_seq {seqexpr} {set pat_l [列出$ seqexpr] set exp_l [] {[llength $ pat_l]&gt; 0} {set pat [lindex $ pat_l 0] set pat_l [lrange $ pat_l 1结束]#任何扩展元素我们为当前模式设置为cross_l []#如果有任何__word__(连续的非Ws)有一个+,则拆分它并加工#每个子模式。 ##好的模式:如果{[regexp -indices {。*(?:\ t | | ^)([^ \ t] * [^ \\](\ +)[^] +)。*} $ PAT _ alt_group plus]} {#puts&#34;在$ alt_group&#34找到alt-group; Lassign $ alt_group sub_b sub_e set alt_group [stringrangroup $ pat $ sub_b $ sub_e] #pls&#34; alt组是:&#39; $ alt_group&#39;&#34;设置prev 0#在任何+上拆分,在它之前没有反斜杠。对于{SET I 0} {$ i <$ i&lt; [字符串长度$ alt_group]} {incr i} {if {[字符串index $ alt_group $ i] ==&#34; +&#34; &amp;&amp; [字符串索引$ alt_group $ i-1]!=&#34; \\&#34;} {#pls&#34;发现+在$ i&#34; Lappend Cross_L [String Range $ Alt_Group $ Prev $ I-1]设置prev [expr $ i + 1]}}#将所有内容递过最后+到$ alt_group的末尾。如果{$ prev!= 0} {lappend cross_l [stringrange $ alt_group $ prev end]}}如果{$ cross_l == []&amp;&amp; [regexp {。*(\ [([0-9] +)( - )( - )(〜[0-9] +)?\])。*} $ PAT _括号D_B DASH D_E d_s]}} {set any_emansion 1 set sub_b [string first $括号$ pat]如果{$ sub_b == -1} {error&#34; can&#39; t重新找到模式的括号expr&#34; SEAS SUB_E [expr $ sub_b + [字符串长度$括号] - 1]设置d_s [string trimleft $ d_s〜]如果{$ d_s ==&#34;&#34;} {set d_s 1} foreach int [list $ d_b $ d_e $ d_s] {if {![string是整数$ int]} {错误&#34;在序列扩展中,可以&#39; t解析&#39; $ int&#39;作为整数&#34;如果{$ d_s == 0} {错误&#34;在序列扩展中,步长可以&#39; t be 0&#34; for {set x $ d_b} {$ x&lt; $ d_e} {incr x $ d_s} {lappend cross_l $ x}}如果{$ cross_l == []&amp;&amp; [regexp-indices {。*(?:[^ \\] | ^)({[^ \}] ^)。*} $ PAT _括号]} {Lassign $括号子_B SEAR中的SUB_E SEAR [String Range $ PAT $ sub_b + 1 $ sub_e-1] foreach elem [split $ sine,] {lappend cross_l $ elem}}如果{$ cross_l == []} {#puts&#34;没有更多的扩展&#39; $ pat& #39;添加到结果&#34; lappend exp_l $ pat} else {#这个完成了。 Foreach Elem $ cross_l {set npat [string replace $ pat $ sub_b $ sub_e $ elem] #pls&#34; pat $ pat | $ elem =&gt; $ npat&#34; lappend pat_l $ npat}}}}}#修复可能找到的任何转义+ [] {}#lmap更好,但对于8.5的那些,一个快速+肮脏的黑客。设置ESC_MAP [列表&#34; \\ +&#34; &#34; +&#34; &#34; \\\ {&#34; &#34; \ {&#34; &#34; \\\}&#34; &#34; \}&#34; &#34; \\\ [&#34; &#34; \ [&#34; &#34; \\\]&#34; &#34; \]&#34;] set exp_l [string map $ esc_map $ exp_l] #puts&#34;结果模式:\ n [加入$ exp_l&#34; \ n&#34;]&#34;返回$ exp_l}

如果从UNIX shell使用此功能,请注意Shell通常使用[]和{}进行Glob扩展。因此,如果要给出这些模式作为命令行输入,则用户需要引用模式以避免弹跳扩展它们,例如,

此外,如果您要将图案写为TCL中的文字,请&#39; d希望将它们用{和}封闭,因此TCL不会扩展[和]。也许不同的语法会更好。

如果您尝试完全解析模式,您当然可以更好地完成。我的代码有嵌套模式的问题。但是可以使用嵌套模式(例如)这样&#39; +&#39;不需要,例如。

但是,我没有花时间来计算平衡的卷曲括号。如果有人希望以合理的方式实施它,请随时免费实现!