PowerShell是否具有与Perl abbrev()函数类似的功能

时间:2011-02-13 00:03:46

标签: powershell

所以在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有类似的东西吗?

3 个答案:

答案 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