2012-04-11 65 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 <<"); 
       };