在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() })