2012-05-20 3 views
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? Если я его не напишу, верните всю строку. Оценивает ли переменная значение?

ответ

8

Результат списка-контекста из map является конкатенацией всех результатов оценки вашего блока для каждого соответствующего хоста. Помните, что возвращаемое значение из блока - это значение последнего оцениваемого выражения, независимо от того, содержит ли ваш код явный return. Без окончательного $name последнее выражение — и, следовательно, блок ’ s Возвращаемое значение — - результат от split.

Другой способ написать это

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

Вы можете сплавить map и grep получить

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

То есть, если данный хост соответствует вашим критериям, а затем разделить его. В противном случае для этого хоста нет результата.

Смежные вопросы