【发布时间】:2021-02-15 07:13:40
【问题描述】:
我正在开发一个函数来通过键层次结构的字符串输入来访问/修改嵌套哈希表,如下所示:
putH() $hashtable "key.key.key...etc." “新价值”
给定:
$c = @{
k1 = @{
k1_1 = @{
k1_1_1 = @{ key = "QQQQQ"}
}
}
}
到目前为止,我已经想出了这个修改值的函数:
function putH ($h,$hKEYs,$nVAL){
if ($hKEYs.count -eq 1) {
$bID = $hKEYs #match the last remaining obj in $hkeys
}
else {
$bID = $hKEYs[0] #match the first obj in $hekys
}
foreach ($tk in $h.keys){
if ($tk -eq $bID){
if ($hKEYs.count -eq 1){ #reached the last obj in $hkeys so modify
$h.$tk = $nVAL
break
}
else {
$trash,$hKEYs = $hKEYs #take out the first obj in $hkeys
$h.$tk = putH $h.$tk $hKEYs $nVAL #call the function again for the nested hashtale
break
}
}
}
return $h
}
还有这个获取值的函数:
function getH ($h,$hKEYs){
if ($hKEYs.count -eq 1) {
$bID = $hKEYs
}
else {
$bID = $hKEYs[0]
}
foreach ($tk in $h.keys){
if ($tk -eq $bID){
if ($hKEYs.count -eq 1){
$h = $h.$tk
break
}
else {
$trash,$hKEYs = $hKEYs
$h = getH $h.$tk $hKEYs
break
}
}
}
return $h
}
我是这样使用的:
$s = "k1.k_1.k1_1_1" #custom future input
$s = $s.split(".")
putH $c ($s) "NEW_QQQQQ"
$getval = getH $c ($s)
我的问题:
有没有更优雅的方法来实现函数的结果...比如调用表达式?
我已经尝试过调用表达式 - 但无法通过它访问 hassstables(无论组合、嵌套引号如何)
$s = "k1.k_1.k1_1_1" #custom future input
iex "$c.$s"
返回
System.Collections.Hashtable.k1.k_1.k1_1_1
【问题讨论】:
-
你需要转义
$c:"`$c.$s" -
谢谢!三天以来,我一直在脑海中。如果我理解正确:通过不转义第一个 $-iex 在 .然后尝试查找整个字符串作为键;并通过转义它 - 扩展 $s 然后整个结果字符串
我对吗? -
如果您不转义
$c,双引号字符串将导致两个变量展开之前iex可以做任何事情.
标签: powershell nested hashtable