将foreach循环插入另一个foreach循环是否安全

时间:2011-01-20 19:02:05

标签: perl scripting

我希望为我的概念脚本添加能力,以便在服务器列表上迭代相同的命令循环,而不是仅通过一台服务器。

在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 个答案:

答案 0 :(得分:6)

是的,这很安全。但是,您可能希望使用除默认$_以外的其他循环变量。

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

答案 1 :(得分:2)

是。这在任何语言中都很常见。

答案 2 :(得分:1)

当然,这是安全的。如果需要,可以将内部命令集包装到方法中,然后让外部foreach循环调用该方法。这至少使你的代码更具可读性。

答案 3 :(得分:1)

使用嵌套循环在技术上没有任何问题,但为了提高效率,您可能希望尝试散列或找到组织数据的方法,以便将最高概率命中组织到列表顶部。

你有一个你正在做的事情的例子吗?

答案 4 :(得分:1)

正如其他答案已经向您保证,是的,使用嵌套循环完全可以保存。

您可能想要标记它们,但是,如果您使用nextlast来突破任何循环,这将特别有用。 (如果你需要打破除最内层之外的任何其他循环,你来使用标签。)

示例:

SERVER:
foreach my $server (@servers) {

    VM:
    foreach my $vm (@getallvms) {

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

    }
}

请参阅perldoc