2

昨天我写了一个小子程序来解析我的/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

问题是,为什么我必须在表达式$name中单独写?map如果我不写它,请收回整行。变量是否计算为其值?

4

1 回答 1

8

来自的列表上下文结果map是为每个匹配主机评估块的所有结果的串联。请记住,块的返回值是最后评估的表达式的值,无论您的代码是否使用显式return. 如果没有 final $name,最后一个表达式——以及块的返回值——是来自split.

另一种写法是

my @hosts = map {(split)[1]} grep {/$criteria/} @allhosts;

你可以融合mapandgrep得到

my @hosts = map { /$criteria/ ? (split)[1] : () } @allhosts;

也就是说,如果给定的主机符合您的条件,则拆分它。否则,该主机没有结果。

于 2012-05-20T11:47:50.620 回答