2013-09-27 56 views
1

我循环通过XML节点,每个节点都创建一个群组,例如以下节点:Perl的foreach循环两难困境

<node name="ps1_uat1" host="" port="20014" /> 
<node name="ps1_uat2" host="" port="20014" /> 
<node name="ps1_uat3" host="" port="20014" /> 

...会生成以下组:

<nodeGroup name="ps1" nodes="" /> 

一切都很好有,但与下面的代码通过循环时,我得到我的循环丢失,它打印出:

<nodeGroup name="ps1" nodes="ps1_it," /> 
<nodeGroup name="ps1" nodes="ps1_it, ps1_uat1," /> 
<nodeGroup name="ps1" nodes="ps1_it, ps1_uat1, ps1_uat2," /> 
<nodeGroup name="ps1" nodes="ps1_it, ps1_uat1, ps1_uat2, ps1_uat3," /> 

我只希望它打印出最后一个,我试图收集所有相似的节点,并将它们推入@nodes数组,然后将其打印在节点属性中。

我的Perl代码:

foreach my $group (@groups) { 
    my @nodes; 
    foreach my $node (@nodenames) { 
     chomp($group); 
     chomp($node); 
     if ($node =~ m/$group/) { 
      push (@nodes, "$node,"); 
      my $groupxml = "\t<nodeGroup name=\"$group\" nodes=\"@nodes\" \/>\n"; 
      print ODSERVERFILE $groupxml; 
     } 
    } 
} 

任何援助表示赞赏。

回答

2

我相信你需要将两行代码移出inner for循环。试试这个:

foreach my $group (@groups) { 
my @nodes; 
foreach my $node (@nodenames) { 

    chomp($group); 
    chomp($node); 

    if ($node =~ m/$group/) { 
     push (@nodes, "$node,"); 
    } 
} 
// These 2 lines go out 
my $groupxml = "\t<nodeGroup name=\"$group\" nodes=\"@nodes\" \/>\n"; 
print ODSERVERFILE $groupxml; 
} 
} 
+0

这样做了。这么简单,但错过了。非常感谢你。 –

+0

@NickA for循环往往很棘手;) – Nikhil