我遇到了一个PowerShell单线程脚本,第一个字符是+(加号)符号,我想知道这样做的意义是什么.
将为字符"A"提供Unicode代码点的示例:
+'A'['']
Run Code Online (Sandbox Code Playgroud)
Mat*_*sen 17
一元+作为该类型的隐式转换int32.
解析器只会尝试将右侧的值转换为整数.
让我们看看(并逐步执行)您的语句,就像解析器一样:
+'A'['']
Run Code Online (Sandbox Code Playgroud)
让我们尝试"标记化"该声明:
+ 'A' [ '' ]
^ ^ ^ ^ ^
| | | | |
| | | | Array index close operator
| | | Empty string
| | Array index open operator
| Literal string of length 1 with value A
Unary + operator
Run Code Online (Sandbox Code Playgroud)
为了知道我们是否可以应用+operater,我们需要评估右手参数:
'A'['']
Run Code Online (Sandbox Code Playgroud)
我们可以索引到字符串(例如'A')的唯一方法是将其视为a char[],并在[和]运算符之间提供整数值.空字符串本身不是整数,但是当隐式转换为1时,它变为0(尝试[int]""或'' -as [int]在powershell中查看此操作).现在声明看起来更像是这样的:
'A'[0]
Run Code Online (Sandbox Code Playgroud)
这个char索引0很明显A,所以现在是我们的右手参数,字符大写A.
我们现在应用unary +和voila,我们得到char的相应ASCII值A,恰好是65.
我们同样可以做到:
+("A" -as [char])
Run Code Online (Sandbox Code Playgroud)
或者,使用Briantist的例子:
"A" -as [char] -as [int]
Run Code Online (Sandbox Code Playgroud)
如果您想知道解析器如何将某个语句拆分为单个标记,请使用以下[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
Run Code Online (Sandbox Code Playgroud)
它在代码高尔夫中用于转换为数字.它短于[int].
重要的['']是方括号用于[char]从字符串中获取a .这''是一个被强制进入的空字符串0.
提问者指的是特定问题的解决方案,其中一个限制是数字0到9根本不能用在答案中.
参见2015年PowerShell One-Liner竞赛以及获胜者对此(相当精彩)解决方案的解释.
| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |