Proc 调用以创建数组并根据要求执行逻辑迭代
Proc call to create Array and perform logical iteration per requirement
TCL代码
- 根据命令输出值作为输入源构建数组。
- 执行逻辑迭代以识别匹配和不匹配值以供决策。
在此,我尝试编写一个 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
备注
- 一般情况下,请选择描述性的名称。
funcName
或 Objectname
等名称并没有告诉读者它们的用途,因此是没有意义的。好名字有助于定义 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 trim
、lassign
和 {*}...
扩展语法。还有 array get
和 array set
用于将数组复制出函数。
TCL代码
- 根据命令输出值作为输入源构建数组。
- 执行逻辑迭代以识别匹配和不匹配值以供决策。
在此,我尝试编写一个 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
备注
- 一般情况下,请选择描述性的名称。
funcName
或Objectname
等名称并没有告诉读者它们的用途,因此是没有意义的。好名字有助于定义 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 trim
、lassign
和 {*}...
扩展语法。还有 array get
和 array set
用于将数组复制出函数。