2012-02-03 3 views
0

나는 perl 스크립트를 powershell 스크립트로 변환하려고 시도하고 있었다.루프를 perl에서 powershell로 변환하는 방법은 무엇입니까?

다음 루핑을 powershell로 변환하는 방법을 모르겠습니다.

my %ba; 
while (my ($before, $afters_aref) = each %deps) { 
    for my $after (@{ $afters_aref }) { 
     $ba{$before}{$after} = 1 if $before ne $after; 
     $ba{$after} ||= {}; 
    } 
} 

변환하도록 도와주세요.

답변

3

저는 이것을 실제로 테스트하지는 않았지만이 방법이 효과가있을 것이라고 생각합니다.

$ba = @{} 
foreach ($dep in $deps.GetEnumerator()) { 
    foreach ($after in $dep.Value) { 
     if ($dep.Key -ne $after) { 
      if (-not $ba.ContainsKey($dep.Key)) { 
       $ba[ $dep.Key ] = @{ $after=1 }; 
      } 
      else { 
       $ba[ $dep.Key ].$after = 1; 
      } 
     } 
     if (-not $ba.ContainsKey($after)) { 
      $ba[ $after ] = @{} 
     } 
    } 
} 

나는 파이프 라인에서 그것을 할 좋아하는 것,하지만, 난 여전히 관련된 모든 단점을 배우는 중이에요.


Perl이 수행하는 자동 가상화를 수행하기 위해이 다른 버전을 채웠습니다. 은 위의 방법으로 $ba을 선언하면 add-member이 될 수 없습니다.

$ba = new-object System.Collections.Hashtable; 
$ba | add-member ScriptMethod deepset { 
    $p = $args; 
    if ($p[0] -is [System.Array]) { 
     $p = $p[0]; 
    } 
    $p = [System.Collections.ArrayList]$p; 
    $last = $p.count - 1; 
    $val = $p[ $last ]; 
    $p.RemoveAt($last--); 
    $key = $p[ $last ]; 
    $p.RemoveAt($last--); 
    $lvl = $this; 
    foreach ($k in $p) { 
     if ($lvl.containsKey($k)) { 
      $old = $lvl.$k; 
      if ($old -isnot [System.Collections.Hashtable]) { 
       $lvl.$k = @{ '.' = $old }; 
      } 
     } 
     else { 
      $lvl.$k = @{}; 
     } 
     $lvl = $lvl.$k; 
    } 
    $lvl.$key = $val; 
    return; 
} 

# allowing the loop to be a bit shorter. 

foreach ($dep in $deps.GetEnumerator()) { 
    foreach ($after in $dep.Value) { 
     if ($dep.Key -ne $after) { 
      $ba.deepset($dep.Key, $after, $true); 
     } 
     if (-not $ba.ContainsKey($after)) { 
      $ba[ $after ] = @{} 
     } 
    } 
} 
관련 문제