2011-02-13 39 views
2

所以在Perl的東西,有一個函數調用縮寫()給定關鍵字的列表,返回一個散列映射所有微創縮寫他們的關鍵字:確實PowerShell中有類似於Perl的縮寫()函數

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

這將返回一個哈希這樣的:

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

在Perl中,這讓我拿用戶的縮寫我的關鍵字,容易正確,只要將它們映射到「真實」的關鍵字作爲用戶輸入的是最低限度獨特。

PowerShell有類似的東西嗎?

回答

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

謝謝你不只是爲了答案,而是爲工作代碼。我是一個新手,仍在學習「思考PowerShell」。我遇到的第二種解決方案。 。 。 - 匹配投擲鍵「^ $ userResponse」。如果我得到不止一場比賽,那麼我收集了一個「你是什麼意思」的錯誤提示。 。 。如果我只有一個,請使用它。有趣的語言。 。 。它需要我花一段時間才能找到我的頭。 – Frank 2011-02-13 06:05:46

1

powershell中的參數可以用這種方式指定。你只需要指定足夠的字母是唯一的。命令和關鍵字需要完全指定。

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} 

由於287]莪指出,這種匹配已經建成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 
相關問題