2012-04-11 50 views
1

我吮吸perl,因爲你可能會告訴我...我正在使用腳本來應用更改到思科設備使用Net :: Application :: Session。我有2個數組,1是接口,1是接口描述。我需要的命令「$ S-> CMD []」要像這樣輸入:2個陣列在一個單一的foreach - perl

$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- the-same-time-in-perl – oalders 2012-04-11 02:32:41

+0

你在說使用each_array嗎? – Matt 2012-04-11 02:41:44

+0

謝謝,這個例子工作,但我希望不使用任何模塊,而不使用List :: MoreUtils模塊。 – Matt 2012-04-11 02:59:21

回答

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'兩次更快。 – 2012-04-11 06:02:10

+0

真的很簡單,快速,就像一個魅力,謝謝! – Matt 2012-04-11 19:29:49

+0

爲什麼第二個被稱爲破壞性? – user13107 2013-09-12 16:38:11

1

另一種方式,如果你喜歡作爲地圖的grep鏈作爲我。

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

這是一大堆無用的工作。 'map {$ s-> cmd(「interface $ changeme [$ _]」); $ s-> cmd(「description >> WAP - $ changename [$ _] <<」); } 0 .. $#changeme;'會更好。 – ikegami 2012-04-11 07:05:54

+0

但它仍然會錯過內存節省和實際計數循環的速度提升。 'for(0 .. $#changeme){$ s-> cmd(「interface $ changeme [$ _]」); $ s-> cmd(「description >> WAP - $ changename [$ _] <<」); }' – ikegami 2012-04-11 07:12:30

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 <<"); 
       };