Perl 将一个foreach循环插入另一个foreach循环安全吗
我想为我的概念脚本添加这样一种能力,即在服务器列表上迭代相同的命令循环,而不是只在一台服务器上迭代 在foreach循环中使用foreach循环是否安全。还是有其他方法可以做到这一点Perl 将一个foreach循环插入另一个foreach循环安全吗,perl,scripting,Perl,Scripting,我想为我的概念脚本添加这样一种能力,即在服务器列表上迭代相同的命令循环,而不是只在一台服务器上迭代 在foreach循环中使用foreach循环是否安全。还是有其他方法可以做到这一点 # Create an empty hash table for discovered virtual machines my %virtual_machines = (); my @getallvms = $ssh1->capture('vim-cmd vmsvc/getallvms'); # Re
# 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}");
}
}
#为发现的虚拟机创建空哈希表
我的%virtual_machines=();
my@getallvms=$ssh1->capture('vim-cmd vmsvc/getallvms');
#从ESX\ESXi输出中删除第一行
shift@getallvms;
#从ESX\ESXi输出收集数据
foreach my$server(@servers){
foreach my$vm(@getallvms){
#匹配ID、名称和VMX文件名
$vm=~m/^(?\d+)\s+(?\s+)\s+\[.+?\]\s+?\/(.+?\.vmx)/xm;
my$id=“$+{id}”;
my$name=“$+{name}”;
#查找每个虚拟机的VMX文件的绝对路径
my$vmx_location=$ssh1->capture(“find-name$+{vmx}”);
}
}
这是我的脚本的一部分,也是我希望按照第一个回答实现的基本概念。是的。这在任何语言中都很常见。是的。这在任何语言中都很常见。是的,它是安全的。但是,您可能希望使用不同的循环变量,而不是默认的
$\uuu
foreach my $server (@servers) {
foreach my $command (@commands) {
# ...
}
}
是的,很安全。但是,您可能希望使用不同的循环变量,而不是默认的
$\uuu
foreach my $server (@servers) {
foreach my $command (@commands) {
# ...
}
}
当然,它是安全的。如果需要,可以将内部命令集包装到一个方法中,然后让外部foreach循环调用该方法。这至少使您的代码更具可读性。当然,它是安全的。如果需要,可以将内部命令集包装到一个方法中,然后让外部foreach循环调用该方法。这至少使您的代码更具可读性。使用嵌套循环在技术上没有错,但为了提高效率,您可能希望尝试使用哈希或找到方法来组织数据,以便将最有可能的命中率组织到列表的顶部
你有一个例子来说明你在做什么吗?使用嵌套循环在技术上没有什么问题,但是为了提高效率,你可能想尝试使用散列或找到方法来组织数据,以便将概率最高的点击组织到列表的顶部
你有一个例子来说明你在做什么吗?正如其他答案已经向你保证的那样,是的,使用嵌套循环非常省钱 不过,您可能需要为它们添加标签,如果您使用
next
或last
来打破任何循环,这将特别有用。(如果需要跳出除最里面的循环以外的任何其他循环,则必须使用标签。)
例如:
SERVER:
foreach my $server (@servers) {
VM:
foreach my $vm (@getallvms) {
next VM if (whatever);
last SERVER if (whatever);
}
}
请参阅。其他答案已经向您保证,是的,使用嵌套循环是完全节省的 不过,您可能需要为它们添加标签,如果您使用
next
或last
来打破任何循环,这将特别有用。(如果需要跳出除最里面的循环以外的任何其他循环,则必须使用标签。)
例如:
SERVER:
foreach my $server (@servers) {
VM:
foreach my $vm (@getallvms) {
next VM if (whatever);
last SERVER if (whatever);
}
}
请参阅。是否修改了这些循环中的元素?不,我只是使用正则表达式和一些数学运算将从服务器收集的数据散列在一起。然后在循环之外,它将被写入XML文件。您不需要在对命名捕获组的访问周围加双引号。您是否在修改这些循环中的元素?不,我只是使用正则表达式和一些数学来组合从服务器收集的数据的散列。然后在循环之外,它将被写入一个XML文件。您不需要在访问命名的捕获组hashperfect!,我只是想确定我不会创建某种会混淆perl或其他东西的连续循环。太好了!,我只是想确定我不会创建某种会混淆perl或其他东西的连续循环。但我强调要做的一件事是使我的代码整洁、易读。谢谢,在某些方面我还是perl新手。但我强调要做的一件事是使我的代码整洁易读。