我非常不熟悉perl语法,并试图修改现有脚本以从结果中排除特定的主机名。
主机名是:
router-<something>
switch-<something>
我想从结果中排除所有以“路由器”开头的结果。
现有脚本中的这一行指出:
# These are hosts that we don't want to alert about.
my %exclude_hosts = map { $_ => 1 } split(',', $exclude_hosts || '');
有两个问题:
我试图了解“地图”在perl中的作用以及map { $_ => 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
的返回列表中变平,从而消失了。
请参阅链接的文档以获取更多详细信息。