作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Powershell 中遇到了一个有趣的问题,但一直无法找到解决方案。当我谷歌搜索(并找到类似 this post 之类的东西)时,没有什么比我想要做的更复杂的事情出现了,所以我想我会在这里发布这个问题。
该问题与外部数组长度为 1 的多维数组有关。看来 Powershell 对扁平化数组非常坚持,比如 @( @('A') )
变成 @( 'A' )
.这是第一个片段(提示是 >,顺便说一句):
> $a = @( @( 'Test' ) )
> $a.gettype().isarray
True
> $a[0].gettype().isarray
False
$a[0].gettype().isarray
是真的,这样我就可以将值索引为
$a[0][0]
(现实世界的场景是在循环内处理动态数组,我想将值设为
$a[$i][$j]
,但如果内部项不被识别为数组而是字符串(在我的情况下),您开始索引字符串的字符,如
$a[0][0] -eq 'T'
)。
$w
被展平,因此没有正确添加到最终数组中。我在网上找到了类似问题的解决方案,这基本上涉及在内部数组之前放置一个逗号以强制外部数组不展平,这确实有效,但同样,我正在寻找一种可以在循环内构建数组的解决方案(一个锯齿状的数组数组,处理一个 CSS 文件),所以如果我将前导逗号添加到单个元素数组(实现为中间数组
$y
),我想对其他数组(如
$z
)做同样的事情),但这会对
$z
产生不利影响被添加到最终数组中。
@( @( 'color', 'black') )
或与
@( @( 'color', 'black'), @( 'background-color', 'white') )
function Display($x, [int]$indent, [string]$title)
{
if($title -ne '') { write-host "$title`: " -foregroundcolor cyan -nonewline }
if(!$x.GetType().IsArray)
{ write-host "'$x'" -foregroundcolor cyan }
else
{
write-host ''
$s = new-object string(' ', $indent)
for($i = 0; $i -lt $x.length; $i++)
{
write-host "$s[$i]: " -nonewline -foregroundcolor cyan
Display $x[$i] $($indent+1)
}
}
if($title -ne '') { write-host '' }
}
### Start Program
$final = @( @( 'a', 'b' ), @('c'))
Display $final 0 'Initial Value'
### How do we do this part ??? ###########
##
$w = @( @('d', 'e') ) ##
$x = @( @('f', 'g'), @('h') ) ##
# But now $w is flat, $w.length = 2 ##
##
##
# Even if we put a leading comma (,) ##
# in front of the array, $y will work ##
# but $w will not. This can be a ##
# problem inside a loop where you don't ##
# know the length of the array, and you ##
# need to put a comma in front of ##
# single- and multidimensional arrays. ##
$y = @( ,@('D', 'E') ) ##
$z = @( ,@('F', 'G'), @('H') ) ##
##
##
##########################################
$final += $w
$final += $x
$final += $y
$final += $z
Display $final 0 'Final Value'
### Desired final value: @( @('a', 'b'), @('c'), @('d', 'e'), @('f', 'g'), @('h'), @('D', 'E'), @('F', 'G'), @('H') )
### As in the below:
#
# Initial Value:
# [0]:
# [0]: 'a'
# [1]: 'b'
# [1]:
# [0]: 'c'
#
# Final Value:
# [0]:
# [0]: 'a'
# [1]: 'b'
# [1]:
# [0]: 'c'
# [2]:
# [0]: 'd'
# [1]: 'e'
# [3]:
# [0]: 'f'
# [1]: 'g'
# [4]:
# [0]: 'h'
# [5]:
# [0]: 'D'
# [1]: 'E'
# [6]:
# [0]: 'F'
# [1]: 'G'
# [7]:
# [0]: 'H'
function Display($x, [int]$indent, [string]$title)
{
if($title -ne '') { write-host "$title`: " -foregroundcolor cyan -nonewline }
if(!$x.GetType().IsArray)
{ write-host "'$x'" -foregroundcolor cyan }
else
{
write-host ''
$s = new-object string(' ', $indent)
for($i = 0; $i -lt $x.length; $i++)
{
write-host "$s[$i]: " -nonewline -foregroundcolor cyan
Display $x[$i] $($indent+1)
}
}
if($title -ne '') { write-host '' }
}
function funA()
{
$ret = @()
$temp = @(0)
$temp[0] = @('p', 'q')
$ret += $temp
Display $ret 0 'Inside Function A'
return $ret # What about return ,$ret ? What about if $ret = @( @('p', 'q'), @('r', 's') ) -- would return ,$ret still work?
}
function funB()
{
$ret = @( ,@('r', 's') )
Display $ret 0 'Inside Function B'
return $ret
}
### Start Program
$z = funA
Display $z 0 'Return from Function A'
$z = funB
Display $z 0 'Return from Function B'
### Desired final value: @( @('p', 'q') ) and same for r,s
### As in the below:
#
# Inside Function A:
# [0]:
# [0]: 'p'
# [1]: 'q'
#
# Return from Function A:
# [0]:
# [0]: 'p'
# [1]: 'q'
最佳答案
还有一个以同样问题开头的问题:Powershell pitfalls .看起来这是设计使然。
我想如果你回来 ,$ret
而不是 $ret
,它应该工作。
另外两个注意事项:
$item -is [array]
测试该项目是否为数组(只是因为它看起来更像 PowerShell ;)@()
仅对不是数组的项目有效。如果您链接 @(@(@(1)))
,您将得到一个包含一个 int 项的数组(@(@(@(1)))[0].gettype()
返回 Int32)。所以,@( ,@('r', 's') )
与 ,@('r', 's')
相同. 关于arrays - 在 Powershell 中避免不可知的锯齿状阵列展平,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2463190/
我是一名优秀的程序员,十分优秀!