ホスト情報を走査する
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 では機能しませんので注意してください。