昨天我写了一个小子例程来解析我的 /etc/hosts 文件并从中获取主机名。
这是子例程:
sub getnames {
my ($faculty, $hostfile) = @_;
open my $hosts ,'<', $hostfile;
my @allhosts = <$hosts>;
my $criteria = "mgmt." . $faculty;
my @hosts = map {my ($ip, $name) = split; $name} grep {/$criteria/} @allhosts; # <-this line is the question
return @hosts;
}
我像getnames('foo','/etc/hosts')
一样称呼它,并取回了与mgmt.foo
正则表达式匹配的主机名。
问题是,为什么我必须在map
表达式中单独写$name
?如果我不写,请收回整行。变量的计算结果是否达到其值?
map
的列表上下文结果是为每个匹配主机评估块的所有结果的串联。请记住,块的返回值是计算的最后一个表达式的值,无论您的代码是否指示显式return
。如果没有最终的$name
,最后一个表达式——以及块的返回值——是 split
的结果。
另一种写法是
my @hosts = map {(split)[1]} grep {/$criteria/} @allhosts;
您可以融合map
并grep
以获得
my @hosts = map { /$criteria/ ? (split)[1] : () } @allhosts;
也就是说,如果给定的主机符合您的条件,则将其拆分。否则,该主机没有结果。