Как преобразовать цикл из Perl в PowerShell? - PullRequest
0 голосов
/ 03 февраля 2012

Я пытался преобразовать скрипт 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} ||= {};
    }
}

Пожалуйста, помогите мне преобразовать его.

1 Ответ

3 голосов
/ 03 февраля 2012

Я действительно не проверял это, но я думаю, что это будет работать.

$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, я выбрал эту другую версию. Вы должны заметить, что я не могу add-member, когда объявлено $ba так, как указано выше.

$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 ] = @{}
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...