Есть ли в PowerShell что-то похожее на функцию Perl abbrev () - PullRequest
2 голосов
/ 13 февраля 2011

Таким образом, в Perl есть функция abbrev (), которая, учитывая список ключевых слов, возвращает хеш, сопоставляющий все минимальные сокращения их ключевому слову:

@keywords = {"this", "and", "that"}
%AbbevList = abbrev(@keywords);

Это вернет Hash, подобный этому:

thi => "this"
this => "this"
tha => "that"
that => "that"
a => "and"
an => "and"
and => "and"

В Perl это позволило мне брать пользовательские аббревиатуры для моих ключевых слов и легко сопоставлять их с "реальным" ключевым словом, если ввод пользователя был минимально уникальным.

Есть ли в PowerShell что-нибудь подобное?

Ответы [ 3 ]

1 голос
/ 14 февраля 2011

Параметры в powershell могут быть указаны таким образом.Вам нужно только указать достаточно букв, чтобы быть уникальным.Команды и ключевые слова должны быть полностью определены.

1 голос
/ 13 февраля 2011

В этом нет ничего, что я знаю, но это не значит, что вы не можете этого получить.

 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
0 голосов
/ 28 августа 2011

Вот альтернативная реализация:

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}

Как указывает Ойсин, это соответствие уже встроено в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...