Вот альтернативная реализация:
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