2011-01-20 12 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

에 대한 액세스를 둘러싼 큰 따옴표를 넣을 필요가 없습니다! 펄을 어떻게 혼란스럽게 할 수있는 연속 루프를 만들지 않으려 고하고 싶었습니다. – ianc1215

2

예. 이것은 모든 언어에서 매우 일반적입니다.

1

물론 안전합니다. 원하는 경우 내부 명령 집합을 메서드로 래핑 한 다음 외부 foreach 루프에서 해당 메서드를 호출하도록 할 수 있습니다. 적어도 코드를 좀 더 읽기 쉽도록 만듭니다.

+0

고마워, 나는 아직도 어떤면에서는 펄에 익숙하지 않다. 하지만 내가해야 할 일 중 하나는 코드를 깔끔하고 깔끔하게 읽을 수있게 만드는 것입니다. – 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를 참조하십시오.

관련 문제