我在一本关于PowerShell脚本的书中找到了以下代码:
$Text = Read-Host -Prompt 'Input your text'
function FastTrain($text) {
$h = @{}
ForEach ($word in [regex]::split($text.ToLower(), '\W+'))
{
$h[$word] = ''
}
$h
}
FastTrain($Text)
它做什么?我认为它从用户获取一个字符串,然后搜索字符,但我不完全确定。
答案 0 :(得分:2)
阅读用户的一行文字
$Text = Read-Host -Prompt 'Input your text'
定义一个函数
function FastTrain($text) {
创建新的哈希表。这是一个将键映射到值的数据结构。
$h = @{}
小写text参数并将其拆分为连续的非单词字符。这导致了一个“单词”数组(但是,因为正则表达式的“单词”字符是一个非常随意的概念,在任何地方都很少使用,这也包括数字,下划线和除字母之外的一堆其他东西)。 / p>
ForEach ($word in [regex]::split($text.ToLower(), '\W+'))
{
在哈希表中使用单词as key并将值设置为空字符串。这只是一个穷人的集合版本,因此散列表将包含来自输入的所有唯一单词作为键(值无关紧要)。
$h[$word] = ''
}
返回哈希表
$h
}
在之前读取的输入上运行上面的函数。这也会导致之前的哈希表被打印在屏幕上,因为默认情况下会输出从语句或管道返回的任何对象。
FastTrain($Text)
请注意,PowerShell功能的这种用法在技术上是不正确的,很容易导致错误。 PowerShell函数与任何其他PowerShell命令一样被调用,但不是,就像.NET方法一样。所以参数用空格分隔,没有括号。在这种情况下,它起作用,因为只有一个参数。
鉴于这个例子是多么残暴,我猜你应该找一本更好的书。这段代码看起来与PowerShell代码应该的外观完全不同(至少在我看来)。该代码执行的功能基本上是“给定一个字符串,从中返回所有唯一的单词”。该函数的更多PowerShell-ey版本可能是:
function Get-UniqueWords($Text) {
$Text.ToLower() -split '\W+' | Select -Unique
}
不要乱用哈希表,只是为了得到一组排序。没有不必要的调用PowerShell运算符就足够的.NET方法。并使用管道来转换和/或过滤数据流。这样的循环通常是不必要的,因为管道通常更容易阅读和掌握(因为你可以只读取事物如何通过管道传输到另一个,而不必解析数据结构发生的事情,以找出数据发生了什么)。 / p>
然而,考虑到我之前对\w
/ \W
的抱怨,以下正则表达式可能会为人类带来更好的结果:
function Get-UniqueWords($Text) {
$Text.ToLower() -split '\P{L}+' | Select -Unique
}
这真的只考虑字母。
答案 1 :(得分:0)
正在阅读用户的一句话:
$Text = Read-Host -Prompt 'Input your text'
然后创建一个空的哈希表(一组键值对):
$h = @{}
然后,将句子分成单词:
[regex]::split($text.ToLower(), '\W+'))
并将每一个添加到哈希表中(将单词作为键,而不是值的任何内容):
$h[$word] = ''
最后,它打印哈希表:
$h
混合了函数定义/调用,但上面是代码所做的。