2012-04-11 16 views
1

私はperlでおそらく言い聞かせることができます...私はNet :: Application :: Sessionを使ってシスコのデバイスに変更を適用するスクリプトを使用しています。私は2つの配列を持っています、1はインターフェイスであり、1はインターフェイスの説明です。私は、コマンド「$は、S-> CMD []」そうのように入力する必要があります。1つのforeach - perlに2つの配列

$s->cmd("interface $configDescription"); 
$s->cmd("description >> WAP - $desName <<"); 

しかし、私はforeach文でそれを行う方法を見つけ出すことはできません。以下は現在私がやっていることです、これは配列の最後の行だけを変更します。助言してください...私はこのサイトにnoobです。これで十分でない情報があれば、何が必要なのか教えてください。ありがとうございました。

foreach $configDescription (@changeme) { 
    foreach $desName (@changename) { 
     $s->cmd("interface $configDescription"); 
     $s->cmd("description >> WAP - $desName <<"); 
    }; 
}; 
+1

それは正しい軌道に乗ってあなたを置く必要があり、この質問への答えのように聞こえます:http://stackoverflow.com/questions/822563/how-can-i-iterate-over-multiple-lists-at- per-time-in-perl – oalders

+0

each_arrayの使用についてお話ししていますか? – Matt

+0

ありがとう、その例は機能しましたが、モジュールを使わずにList :: MoreUtilsモジュールを使用せずにこれを行うようにしています。 – Matt

答えて

5

パラレルアレイと呼ばれます。

for my $i (0..$#changeme) { 
    my $configDescription = $changeme[$i]; 
    my $desName   = $changename[$i]; 
    $s->cmd("interface $configDescription"); 
    $s->cmd("description >> WAP - $desName <<"); 
} 

または:(破壊)

while (@changeme) { 
    my $configDescription = shift(@changeme); 
    my $desName   = shift(@changename); 
    $s->cmd("interface $configDescription"); 
    $s->cmd("description >> WAP - $desName <<"); 
} 
+0

一番上のものは、単に二つの配列の長さを見つけて、インデックスを使ってループを考えています。シンプルでわかりやすく、速い。実際、 'map'を2回使用するよりも高速です。 –

+0

本当にシンプルで速い、魅力のように動作します、ありがとう! – Matt

+0

2番目のものが破壊的と呼ばれるのはなぜですか? – user13107

1

別の方法、あなたは私のように、マップのgrepチェーンのように好きなら。

map { 
    $s->cmd("interface $_->[0]"); 
    $s->cmd("description >> WAP - $_->[1] <<"); 
} 
map { [ $changeme[$_], $changename[$_] ] } 
0..$#changeme 
; 
+0

それは無駄な仕事の大部分です。 'map {$ s-> cmd("インタフェース$ changeme [$ _] "); $ s-> cmd( "description >> WAP - $ changename [$ _] <<"); } 0 .. $#changeme; 'これで良いでしょう。 – ikegami

+0

しかし、実際のカウントループのメモリ節約とスピードブーストにはまだ逃げています。 'for(0 .. $#changeme){$ s-> cmd(" interface $ changeme [$ _] "); $ s-> cmd( "description >> WAP - $ changename [$ _] <<"); } ' – ikegami

1
use Algorithm::Loops 'MapCar'; # or MapCarE, MapCarU, etc. 

MapCar { 
    my ($configDescription, $desName) = @_; 
    $s->cmd("interface $configDescription"); 
    $s->cmd("description >> WAP - $desName <<"); 
} \@changeme, \@changename; 
0

私はちょうど文書の目的のための別の解決策として、これを上に追加しようと思いました。

use List::MoreUtils qw(each_array); 

my $it = each_array(@changeme, @changename); 
       while (my ($configDescription, $desName) = $it->()) { 
       $s->cmd("interface $configDescription"); 
       $s->cmd("description >> WAP - $desName <<"); 
       }; 
関連する問題