【问题标题】:2 arrays in a single foreach - perl单个 foreach 中的 2 个数组 - perl
【发布时间】:2023-03-27 09:28:02
【问题描述】:

你可能会说,我对 perl 很烂……我正在使用脚本将更改应用到使用 Net::Application::Session 的 Cisco 设备。我有 2 个数组,1 个是接口,1 个是接口描述。我需要像这样输入命令“$s->cmd[]”:

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

但我无法弄清楚如何使用 foreach 语句来做到这一点。下面是我目前正在做的事情,这只改变了数组中的最后一行。请建议...我是这个网站的菜鸟,如果这还不够信息,请告诉我需要什么。谢谢。

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

【问题讨论】:

  • 听起来这个问题的答案应该让你走上正轨:stackoverflow.com/questions/822563/…
  • 你说的是使用each_array吗?
  • 谢谢,该示例有效,但是我希望不使用 List::MoreUtils 模块,不使用任何模块。
  • @Matt,这是一个愚蠢的要求。在模块之外可用的 Perl 越来越少。来自 CPAN 的代码很糟糕但来自 SO 的代码还可以的想法更加愚蠢。
  • 您可以随时从您不想使用的模块中复制代码...

标签: arrays perl foreach


【解决方案1】:

它们被称为并行数组。

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

【讨论】:

  • 第一个是简单地找到两个数组的长度,然后通过索引循环思考它们。简单、易懂、快速。事实上,它比使用两次map 更快。
  • 为什么第二个叫破坏性?
  • @user13107,破坏性算法是一种改变其输入的算法。在这种情况下,它会清空 @change@changename
【解决方案2】:

另一种方式,如果你和我一样喜欢 map-grep 链。

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

【讨论】:

  • 这是一大堆无用的工作。 map { $s-&gt;cmd("interface $changeme[$_]"); $s-&gt;cmd("description &gt;&gt; WAP - $changename[$_] &lt;&lt;"); } 0..$#changeme; 会更好。
  • 但它仍然会错过实际计数循环的内存节省和速度提升。 for (0..$#changeme) { $s-&gt;cmd("interface $changeme[$_]"); $s-&gt;cmd("description &gt;&gt; WAP - $changename[$_] &lt;&lt;"); }
【解决方案3】:
use Algorithm::Loops 'MapCar'; # or MapCarE, MapCarU, etc.

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

【讨论】:

    【解决方案4】:

    我想我会将其添加为另一种解决方案,仅用于文档目的。

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

    【讨论】:

      猜你喜欢
      • 2016-09-15
      • 1970-01-01
      • 2015-01-02
      • 2015-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      相关资源
      最近更新 更多