如何解决如何在引用数组中的单个元素时强制自定义Powershell函数的行为类似于[System.String]方法Split
示例:
"a b c d e f g".Split(" ")[0]
a
当我尝试通过函数执行相同操作
function MyReturnArray
{
$array = @('a','b','c','d','e','f','g')
return $array
}
MyReturnArray[0] : The term 'MyReturnArray[0]' is not recognized as the name of a cmdlet,function,script file,or operable program. Check the spelling of the
name,or if a path was included,verify that the path is correct and try again.
At line:1 char:1
+ MyReturnArray[0]
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (MyReturnArray[0]:String) [],CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
但是,这可行:
(MyReturnArray)[0]
a
问题是,为什么.Split()
方法类型的[System.String]
不需要分组()或括号来访问单个元素?但是我必须有自己的职能。我如何强迫它像.Split()
一样动作?
解决方法
“如何强制其像使用
.Split()
一样进行操作?”
(令人失望的)答案是:您不
为什么?因为那根本不是语言的工作方式:)
更完整的解释:
元素访问运算符[]
用于我们称之为语法有界表达式(在PowerShell 3.0 Language Specification中称为 primary expression ,我只知道尝试记录PowerShell完整语法的官方文件。
"a b c d e f".Split()
是我们所说的成员访问表达式-它本身包括:
- 另一个有界表达式
"a b c d e"
- 实例成员访问运算符
.
和 - 具有参数列表
Split
和()
的成员参数。
成员访问表达式是有界表达式-结束)
是成员访问运算符(中间的.
)可能接受的最后一个可能的标记,因此我们知道表达式结束。
是什么使字符串文字"a b c d e f"
成为有界表达式?与上述原理相同,解析器可以通过查看前端和后端的"
独立地确定字符串的边界。
MyReturnArray
不是 有界表达式。这是一个命令表达式 _,并且有单独的命令表达式解析规则,以使参数绑定能够像在PowerShell中一样工作,而且还允许命令名称为任何东西-如果您想创建一个字面名为MyReturnArray[0]
的函数,那绝对是有效的。
如您所见,您可以将其括在()
括号中,从而为调用MyReturnArray
创建一个语法边界,[]
可以对其进行运算。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。