Лямбда-выражение в Powershell

У меня есть код в C #, который использует лямбда-выражения для передачи делегата в метод. Как я могу добиться этого в 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);

И это сценарий PowerShell без лямбда-выражения на месте:

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

Note: Мой вопрос не о решении этой проблемы регулярных выражений. Я просто хочу знать, как передать лямбда-выражение в метод, который получает делегаты в PowerShell.

Ответы на вопрос(3)

Решение Вопроса

В 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(...)
 Sina Iravanian12 июн. 2012 г., 16:11
И спасибо также за упоминаниеparam($m) синтаксис внутри блоков скрипта.
 Joe Phillips18 нояб. 2016 г., 20:34
Если кому-то нужен реальный пример:$repo.Deployments.FindOne({ param($d) $d.EnvironmentId -eq $envId });

Иногда ты просто хочешь что-то вроде этого:

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

(который объявит анонимную «функцию» и немедленно вызовет ее.)

Ты можешь использовать эту перегрузку

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

Делегат передается как блок скриптов (лямбда-выражение), и к MatchEvaluator можно получить доступ через переменную $ args

[regex]::replace('hello world','hello', { $args[0].Value.ToUpper() })
 Shay Levy12 июн. 2012 г., 16:04
В общем, да. Я не знаю ни одной документации.
 Sina Iravanian12 июн. 2012 г., 16:13
Спасибо, это работает. И +1 за упоминание$args массив внутри блока скрипта.
 Shay Levy12 июн. 2012 г., 16:24
Благодарность! В качестве альтернативы вы можете определить именованные параметры с помощью ключевого слова param.
 Trevor Sullivan12 июн. 2012 г., 15:52
Можете ли вы использовать ScriptBlock вместо любого делегата? Где это задокументировано?

Ваш ответ на вопрос