【问题标题】:Lambda Expression in PowershellPowershell 中的 Lambda 表达式
【发布时间】:2012-06-12 11:24:34
【问题描述】:

我有一个 C# 代码,它使用 lambda 表达式将委托传递给一个方法。如何在 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);

这是没有 lambda 表达式的 PowerShell 脚本:

$input = "(,)(;)(:)(!)";
$pattern = "\((?<val>[\,\!\;\:])\)";
$r = New-Object System.Text.RegularExpressions.Regex $pattern
$result = $r.Replace($input, "WHAT HERE?")
Write-Host $result

注意:我的问题不是解决这个正则表达式问题。我只想知道如何将 lambda 表达式传递给在 PowerShell 中接收委托的方法。

【问题讨论】:

    标签: powershell lambda


    【解决方案1】:

    在 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] 将字符串转换为正则表达式:

    $r = [regex]"\((?<val>[\,\!\;\:])\)"
    $r.Matches(...)
    

    【讨论】:

    • 还要感谢您在脚本块中提及param($m) 语法。
    • 如果有人想要一个真实的例子:$repo.Deployments.FindOne({ param($d) $d.EnvironmentId -eq $envId });
    【解决方案2】:

    有时你只想要这样的东西:

    {$args[0]*2}.invoke(21)
    

    (它将声明一个匿名“函数”并立即调用它。)

    【讨论】:

      【解决方案3】:

      你可以使用这个重载

      [regex]::replace(
         string input,
         string pattern, 
         System.Text.RegularExpressions.MatchEvaluator evaluator
      )
      

      委托作为脚本块(lambda 表达式)传递,可以通过 $args 变量访问 MatchEvaluator

      [regex]::replace('hello world','hello', { $args[0].Value.ToUpper() })
      

      【讨论】:

      • 你能用 ScriptBlock 代替任何委托吗?这是在哪里记录的?
      • 一般来说,是的。我不知道有任何文档。
      • 感谢这项工作。并且 +1 用于提及脚本块内的 $args 数组。
      • 谢谢!或者,您可以使用 param 关键字定义命名参数。
      猜你喜欢
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-13
      • 2017-10-02
      • 2013-06-30
      • 2011-01-26
      相关资源
      最近更新 更多