2011-01-20 6 views
1

私のコンセプトスクリプトの機能を追加して、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

へのアクセスを二重引用符で囲む必要はありません!私はperlや何かを混乱させる何らかの連続ループを作成しないと確信していました。 – ianc1215

2

はい。これはどの言語でもかなり一般的です。

1

もちろん、安全です。必要に応じて、内側のコマンドセットをメソッドにラップし、外側のforeachループでそのメソッドを呼び出すことができます。少なくともあなたのコードは少し読みやすくなります。

+0

ありがとう、私はまだいくつかの点でperlには新しいです。しかし、私がしなければならないことは、自分のコードをきちんとした、きちんとした、読みやすいものにすることです。 – ianc1215

1

ネストされたループの使用には技術的に問題はありませんが、効率を上げるために、ハッシュを試したり、データを整理してリストの上部に最も高い確率でヒットするようにしてください。

あなたは何をしているのか?

+0

例を追加しました。 – ianc1215

1

他の回答が既にあなたに保証されているように、ネストされたループを使用するのは完全に省かれています。

ラベルを付けることができますが、これは、nextまたはlastを使用していずれかのループから脱出する場合に特に便利です。 (あなたが最も内側の1以外のループから抜け出すために必要がある場合は、ラベルを使用するを持っている。)

例:

SERVER: 
foreach my $server (@servers) { 

    VM: 
    foreach my $vm (@getallvms) { 

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

    } 
} 

perldocを参照してください。

関連する問題