gethostent

ホスト情報を走査する

構文

解説

gethostent はシステムのホスト情報(Linux では主に /etc/hosts に登録されている情報)にアクセスし、 ホスト情報を返します。引数はありません。

#    0      1         2          3        4
my ( $name, $aliases, $addrtype, $length, @addrs ) = gethostent;
No. 変数 意味 実例
0 $name ホスト名 localhost
1 $aliases エイリアス (別名)
2 $addrtype アドレスタイプ(アドレスファミリー)(2: IPv4, 10: IPv6) 2 (IPv4)
3 $length アドレスのバイト長 4
4 @addrs IP アドレスリスト (127.0.0.1) (各 IP アドレスはバイナリーデータ)

gethostent はイテレーターとして機能しますので、一般的には while ループで使われます。 以下のサンプルコードは、ホスト名を一覧出力します。

while ( my @info = gethostent ) {
    print $info[0], "\n";
}

gethostent はスカラーコンテキストであれば、最初の項目であるホスト名のみを返します。 そのため、前述のサンプルコードは次のように書き換えても同じです。

while ( my $name = gethostent ) {
    print $name, "\n";
}

@addrs の IP アドレスリストの各 IP アドレスは、バイナリーデータで格納されます。 そのため、Socket モジュールの inet_ntoa 関数を使って文字列に変換すると良いでしょう。

use Socket;
while ( my ( $name, $aliases, $addrtype, $length, @addrs ) = gethostent ) {
    print $name, ': ', join( ', ', map { inet_ntoa($_) } @addrs ), "\n";
}

上記サンプルコードは次のような結果を出力します。

localhost: 127.0.0.1
DESKTOP-F89S1UF.: 127.0.1.1
ip6-localhost: 127.0.0.1

もし Socket モジュールを使いたくなければ、unpack で文字列化することも可能です。

while ( my ( $name, $aliases, $addrtype, $length, @addrs ) = gethostent ) {
    for ( my $i = 0 ; $i < @addrs ; $i++ ) {
        $addrs[$i] = join( '.', unpack( 'C4', $addrs[$i] ) );
    }
    print $name, ': ', join( ', ', @addrs ), "\n";
}

なお、gethostent は Windows では機能しませんので注意してください。