Безопасно ли вставлять цикл foreach в другой цикл foreach? - PullRequest
1 голос
/ 20 января 2011

Я хочу добавить в свой концептуальный сценарий возможность повторять один и тот же цикл команд по списку серверов, а не только по одному серверу.

Безопасно ли иметь цикл foreach внутрицикл foreach.Или есть другой способ сделать это?

# Create an empty hash table for discovered virtual machines

my %virtual_machines = ();


my @getallvms = $ssh1->capture('vim-cmd vmsvc/getallvms');

# Remove first line from ESX\ESXi output

shift @getallvms;

# Collect data from ESX\ESXi output
foreach my $server (@servers) {
    foreach my $vm (@getallvms) {

    # Match ID, NAME and VMX file name

    $vm =~  m/^(?<ID> \d+)\s+(?<Name> \S+)\s+\[.+?\]\s+.+?\/(?<VMX> .+?\.vmx)/xm;

    my $id = "$+{ID}";

    my $name = "$+{Name}";

    # Find the absolute path to the VMX file for each virtual machine

    my $vmx_location = $ssh1->capture("find -name $+{VMX}");
    }
}

Это часть моего сценария и основная концепция, которую я хочу достичь согласно первому ответу.

Ответы [ 5 ]

6 голосов
/ 20 января 2011

Да, это безопасно. Однако вы, вероятно, захотите использовать другие переменные цикла, отличные от значений по умолчанию $_.

foreach my $server (@servers) {
   foreach my $command (@commands) {
       # ...
   }
}
2 голосов
/ 20 января 2011

Да.Это довольно распространено на любом языке.

1 голос
/ 21 января 2011

Поскольку другие ответы уже заверили вас, да, использование вложенных циклов совершенно безопасно.

Возможно, вы захотите пометить их, однако это особенно полезно, если вы используете next или * 1004.* вырваться из любой петли.(Если вам нужно выйти из любого другого цикла, кроме самого внутреннего, у вас есть для использования меток.) ​​

Пример:

SERVER:
foreach my $server (@servers) {

    VM:
    foreach my $vm (@getallvms) {

        next VM if (whatever);
        last SERVER if (whatever);

    }
}

См. perldoc .

1 голос
/ 20 января 2011

Технически нет ничего плохого в использовании вложенных циклов, но ради эффективности вы можете поэкспериментировать с хэшами или найти способы упорядочить данные так, чтобы попадания с наибольшей вероятностью были организованы в верхней части списков. *

У вас есть пример того, что вы делаете?

1 голос
/ 20 января 2011

Конечно, это безопасно.Если вы хотите, вы можете обернуть свой внутренний набор команд в метод и затем вызвать внешний цикл foreach для вызова этого метода.По крайней мере, это делает ваш код немного более читабельным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...