Я столкнулся с одним слоем PowerShell script, для которого самый первый символ - знак + (плюс), и мне было интересно, что это значит.
Пример, который даст кодовую точку Unicode для символа "A":
+'A'['']
Я столкнулся с одним слоем PowerShell script, для которого самый первый символ - знак + (плюс), и мне было интересно, что это значит.
Пример, который даст кодовую точку Unicode для символа "A":
+'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
(попробуйте [int]""
или '' -as [int]
в powershell, чтобы увидеть это в действии). Теперь выражение выглядит примерно так:
'A'[0]
Этот char
в индексе 0
, очевидно, A
, и поэтому теперь это наш правый аргумент, символ uppercase A.
Теперь мы применим унарные +
и voila, получим соответствующее значение ASCII для char A
, которое оказывается 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]
.
Значение ['']
заключается в том, что квадратные скобки используются для получения a [char]
из строки. ''
- это пустая строка, которая принуждается к 0
.
Ответчик ссылается на решение конкретной проблемы, где одним из ограничений было то, что цифры от 0 до 9 вообще не могли быть использованы в ответе.
Смотрите PowerShell One-Liner Contest 2015 и объяснение от этого (довольно блестящего) решения от победителя.