在PowerShell中的Lambdaexpression式
我有一个C#中的代码使用lambdaexpression式委托传递给一个方法。 我怎样才能在PowerShell中实现这一点。 例如下面是一个C#代码:
string input = "(,)(;)(:)(!)"; string pattern = @"\((?<val>[\,\!\;\:])\)"; var r = new Regex(pattern); string result = r.Replace(input, m => { if (m.Groups["val"].Value == ";") return "[1]"; else return "[0]"; }); Console.WriteLine(result); 这是没有使用lambdaexpression式的PowerShell脚本:
 $input = "(,)(;)(:)(!)"; $pattern = "\((?<val>[\,\!\;\:])\)"; $r = New-Object System.Text.RegularExpressions.Regex $pattern $result = $r.Replace($input, "WHAT HERE?") Write-Host $result 
注意:我的问题不是解决这个正则expression式问题。 我只想知道如何将一个lambdaexpression式传递给在PowerShell中接收委托的方法。
 在PowerShell 2.0中,您可以使用脚本块( { some code here } )作为委托: 
 $MatchEvaluator = { param($m) if ($m.Groups["val"].Value -eq ";") { #... } } $result = $r.Replace($input, $MatchEvaluator) 
或者直接在方法调用中:
 $result = $r.Replace($input, { param ($m) bla }) 
小费:
 您可以使用[regex]将string转换为正则expression式: 
 $r = [regex]"\((?<val>[\,\!\;\:])\)" $r.Matches(...) 
有时你只想要这样的东西:
 {$args[0]*2}.invoke(21) 
(将会声明一个匿名的“函数”并立即调用它。)
你可以使用这个过载
 [regex]::replace( string input, string pattern, System.Text.RegularExpressions.MatchEvaluator evaluator ) 
委托作为脚本块(lambdaexpression式)传递,MatchEvaluator可以通过$ argsvariables访问
 [regex]::replace('hello world','hello', { $args[0].Value.ToUpper() })