2011-01-20 3 views
1

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

Безопасно ли иметь петлю 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}"); 
    } 
} 

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

+0

Вы изменяете элементы в этих циклах? – robert

+0

Нет Я просто использую регулярное выражение и некоторую математику, чтобы собрать хэш данных, собранных с сервера (ов). Затем вне цикла он будет записан в файл XML. – ianc1215

+0

вам не нужно ставить двойные кавычки вокруг ваших обращений к именованным группам захвата хэша –

ответ

6

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

foreach my $server (@servers) { 
    foreach my $command (@commands) { 
     # ... 
    } 
} 
+0

perfect !, Я просто хотел убедиться, что не собираюсь создавать какой-то непрерывный цикл, который бы путал perl или что-то в этом роде. – ianc1215

2

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

1

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

+0

Спасибо, я по-прежнему новичок в perl. Но одно, что я подчеркиваю, это сделать мой код аккуратным, аккуратным и легким для чтения. – ianc1215

1

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

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

+0

Я добавил пример. – ianc1215

1

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

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

Пример:

SERVER: 
foreach my $server (@servers) { 

    VM: 
    foreach my $vm (@getallvms) { 

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

    } 
} 

См perldoc.

Смежные вопросы