Я столкнулся с одним слоем 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 и объяснение от этого (довольно блестящего) решения от победителя.