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;

mapあなたはとを融合することができgrepます

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

つまり、特定のホストが基準を満たしている場合は、それを分割します。それ以外の場合、そのホストの結果はありません。

于 2012-05-20T11:47:50.620 に答える