如何在Perl中排除主机名

时间:2018-10-01 21:05:57

标签: perl

我非常不熟悉perl语法,并试图修改现有脚本以从结果中排除特定的主机名。

主机名是:

router-<something>
switch-<something>

我想从结果中排除所有以“路由器”开头的结果。

现有脚本中的这一行指出:

    # These are hosts that we don't want to alert about.
    my %exclude_hosts = map { $_ => 1 } split(',', $exclude_hosts || '');

有两个问题:

  1. 我试图了解“地图”在perl中的作用以及map { $_ => 1 }具体在

  2. 中的作用
  3. 我如何在该语句中插入逻辑以排除所有以“路由器”开头的主机?

1 个答案:

答案 0 :(得分:1)

该行将建立一个查找表,其中每个主机都有一个简单的(1)条目。

内置map可以获取列表,并通过运行special variable $_中可用的每个元素的代码块来生成输出列表。对于每个元素,块中最后一个求值语句的返回值(可能是一个或多个标量(或没有))将被平整化为最终返回的列表。

在这里,每个元素都有一对,元素本身为$_1=> operator是引用其左侧操作数的,)。偶数大小的列表可以分配给散列(字典),从而连续的元素成为键值对。因此,$_中的每个主机都将成为一个键,其值为1

然后,要排除元素,请过滤提供给map的列表 使用grep

my %exclude_hosts = 
    map { $_ => 1 } 
    grep { not /^router/ } 
    split(',', $exclude_hosts || '');

或在map本身中完成

my %exclude_hosts = 
    map { (not /^router/) ? $_ => 1 : () } 
    split(',', $exclude_hosts || '');

空白列表()map的返回列表中变平,从而消失了。

请参阅链接的文档以获取更多详细信息。