Proc 调用以创建数组并根据要求执行逻辑迭代

Proc call to create Array and perform logical iteration per requirement

TCL代码

  1. 根据命令输出值作为输入源构建数组。
  2. 执行逻辑迭代以识别匹配和不匹配值以供决策。

在此,我尝试编写一个 proc 调用,它将 return 数组矩阵。 Post 那,我将尝试与 returned 数组进行数组比较,以找出我在数组中查找的值是否存在,并列出这些值。

proc funcName { args } {
    puts "$args"
    for {set i 0} {$i < [llength $args]} {incr i} {
        set Element [lindex $args $i]
        puts $Element
        set Element1 [split $Element "*"]
        puts $Element1
        foreach {F1 F2} $Element1 break
        puts "$F1 -- $F2"
        #ARRAY define
        set Objectname($F1) "$F2"
        foreach index [array names Objectname] {
            puts "Objectname($index): $Objectname($index)"
        }
    }
}

set  Value " X: *ACTIVE | Y: *ACTIVE | Z: *INACTIVE | Q: *NONE "
set Object [ split "$Value" | ]
funcName $Object
X: ACTIVE
Y: ACTIVE
Z: ACTIVE
Q: NONE  

在上述块中,我要求对元素 Z:INACTIVE 进行关键字搜索,X: ACTIVE。我想动态地做并与每个元素进行比较,如果万一找到结果说 "Matched " 并且它是值。

我想我明白了 Vishal 的要求,给定字符串,创建一个数组。这是我的尝试:

代码

proc makePairs {strData} {
    set pairs {}
    foreach kv [split $strData "|"] {
        lassign [split $kv ":"] k v
        set k [string trim $k]
        set v [string trim $v " *"]
        lappend pairs $k $v
    }

    return $pairs
}

set  value " X: *ACTIVE | Y: *ACTIVE | Z: *INACTIVE | Q: *NONE "
array set ar [makePairs $value]
parray ar

输出

ar(Q) = NONE
ar(X) = ACTIVE
ar(Y) = ACTIVE
ar(Z) = INACTIVE

备注

  • 一般情况下,请选择描述性的名称。 funcNameObjectname 等名称并没有告诉读者它们的用途,因此是没有意义的。好名字有助于定义 problem/solution
  • 我的方法首先将字符串拆分为 "|",然后再拆分为 ":"

如何return一个数组(总结:return一个字典):

  • Returning arrays from Procedures in TCL

但是,您的输入和处理也存在实质性问题。特别是,您可能应该写:

proc funcName { args } {
    foreach Element $args {
        lassign [split $Element "*"] F1 F2
        set Objectname([string trim $F1 " :"]) [string trim $F2]
    }
    foreach index [array names Objectname] {
        puts "Objectname($index): $Objectname($index)"
    }
    return [array get Objectname]
}

set Value " X: *ACTIVE | Y: *ACTIVE | Z: *INACTIVE | Q: *NONE "
array set Object [funcName {*}[split $Value "|"]]
# Show we've really got it...
puts "$Object(X), $Object(Y), $Object(Z), $Object(Q)"

这里的关键是使用 foreach more、string trimlassign{*}... 扩展语法。还有 array getarray set 用于将数组复制出函数。