2013-09-27 48 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