我遇到了一个PowerShell单行脚本,其中第一个字符是+(加号),我想知道这样做的意义是什么。
给出字符'A' Unicode码位的示例:
+'A'['']
一元+
作为类型int32
的隐式强制转换。
解析器将简单地尝试将右边的值转换为整数。
让我们看一下(并逐步执行)您的语句,就像解析器所做的那样:
+'A'['']
让我们试着"tokenize"这个语句:
+ 'A' [ '' ]
^ ^ ^ ^ ^
| | | | |
| | | | Array index close operator
| | | Empty string
| | Array index open operator
| Literal string of length 1 with value A
Unary + operator
为了知道是否可以应用+
操作符,我们需要计算右边的实参:
'A'['']
我们可以索引到字符串(如'A'
)的唯一方法是将其视为char[]
,并提供[
和]
运算符之间的整数值。空字符串本身不是整数,但是当隐式转换为整数时,它变成0
(尝试在powershell中查看[int]""
或'' -as [int]
)。现在语句看起来更像这样:
'A'[0]
索引0
处的char
显然是A
,所以它现在是我们的右参数,大写字母a
我们现在应用一元+
,瞧,我们得到了char A
对应的ASCII值,正好是65
。
我们也可以这样做:
+("A" -as [char])
或者,用Briantist的例子:
"A" -as [char] -as [int]
如果您想知道解析器如何将某个语句拆分为单个标记,请使用[PSParser]::Tokenize()
方法:
PS C:> $errors = @()
PS C:> $script = "+'A'['']"
PS C:> $tokens = [System.Management.Automation.PSParser]::Tokenize($script,[ref]$errors)
PS C:> $tokens | select Content, Type
Content Type
------- ----
+ Operator
A String
[ Operator
String
] Operator
在代码高尔夫中用于转换为数字。它比[int]
短
['']
的意义在于使用方括号从字符串中获取[char]
。''
是一个被强制转换为0
的空字符串。
提问者指的是一个特定问题的解决方案,其中一个限制是数字0到9不能在答案中使用。
查看PowerShell One-Liner Contest 2015以及获胜者对这个(相当出色的)解决方案的解释。