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