所以在Perl中,有一个函数调用abbrev()给出一个关键字列表,返回一个哈希映射,将所有最小缩写映射到它们的关键字:
@keywords = {"this", "and", "that"}
%AbbevList = abbrev(@keywords);
这将返回一个像这样的哈希:
thi => "this"
this => "this"
tha => "that"
that => "that"
a => "and"
an => "and"
and => "and"
在Perl中,这允许我为我的关键字使用用户缩写,并且只要用户的输入最低限度唯一,就可以轻松地将它们正确地映射到“真实”关键字。
PowerShell有类似的东西吗?
答案 0 :(得分:1)
我所知道的并没有内置,但这并不是说你不能拥有它。
function abbrevs {
param ([string[]]$list)
$abbrs = @{}
$list |% {
foreach ($i in 1..($_.length)){
if (($list -like "$(($_.substring(0,$i)) + '*')").count -eq 1){
$abbrs[$_.substring(0,$i)] = $_
}
}
}
$abbrs
}
$abbr_table = abbrevs @("this","that","and")
$abbr_table.getenumerator() | sort name | fl
Name : a
Value : and
Name : an
Value : and
Name : and
Value : and
Name : tha
Value : that
Name : that
Value : that
Name : thi
Value : this
Name : this
Value : this
答案 1 :(得分:1)
powershell中的参数可以这种方式指定。您只需指定足够的字母即可。但是,需要完全指定命令和关键字。
答案 2 :(得分:0)
这是一个替代实现:
function abbrev( [string[]]$words ) {
$abbrevs = @{}
foreach( $word in $words ) {
1..$word.Length |
% { $word.Substring( 0, $_ ) } |
? { @($words -match "^$_").Length -eq 1 } |
% { $abbrevs.$_ = $word }
}
$abbrevs
}
与mjolinor的方法类似,它检查每个单词的每个子字符串,将那些只匹配当前单词的字符串添加到哈希表中。
正如弗兰克在评论中指出的那样,您也可以简单地保存所有匹配项,并使用非唯一条目来消除选项之间的歧义:
$keywords = 'this','and','that'
$abbrevs = @{}
foreach( $word in $keywords ) {
1..$word.Length |
% { $word.Substring( 0, $_ ) } |
% { $abbrevs.$_ = @($words -match "^$_") }
}
$abbrevs
Name Value
---- -----
an {and}
that {that}
and {and}
tha {that}
thi {this}
t {this, that}
th {this, that}
a {and}
this {this}
正如Oisin所指出的,这种匹配已经内置于powershell中:
function f( [switch]$this, [switch]$that ) {
if( $this ) { 'this' }
if( $that ) { 'that' }
}
> f -thi
this
> f -th
f : Parameter cannot be processed because the parameter name 'th' is ambiguous.
Possible matches include: -this -that.
At line:1 char:2
+ f <<<< -th
+ CategoryInfo : InvalidArgument: (:) [f], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : AmbiguousParameter,f