ネットワーク情報を走査する
getnetent
はシステムのネットワークデータベース(Linux では主に
/etc/networks
に登録されている情報)にアクセスし、
ネットワーク情報を返します。引数はありません。
# 0 1 2 3
my ( $name, $aliases, $addrtype, $net ) = getnetent;
No. | 変数 | 意味 | 実例 |
---|---|---|---|
0 | $name |
ネットワーク名 | link-local |
1 | $aliases |
エイリアス (別名) |
|
2 | $addrtype |
アドレスタイプ(アドレスファミリー)(Linux なら 2 : IPv4, 10 : IPv6) |
2 (IPv4) |
3 | $net |
ネットワークアドレス | 2851995648 (169.254.0.0) |
getnetent
はイテレーターとして機能しますので、一般的には while
ループで使われます。
以下のサンプルコードは、ネットワーク名を一覧出力します。
while ( my @info = getnetent ) {
print $info[0], "\n";
}
getnetent
はスカラーコンテキストであれば、最初の項目であるネットワーク名のみを返します。
そのため、前述のサンプルコードは次のように書き換えても同じです。
while ( my $name = getnetent ) {
print $name, "\n";
}
$net
のネットワークアドレスは、4 バイトの IP アドレスを数値として表現したものです。
正確に言うと、ネットワークバイトオーダー(ビッグエンディアン)の符号なし 32 ビット整数 (unsigned long) です。
そのため、pack
と unpack
を使って文字列に変換します。
while ( my ( $name, $aliases, $addrtype, $net ) = getnetent ) {
my $addr = join( '.', unpack( 'C4', pack( 'N', $net ) ) ); # 数値表現の IP アドレスを文字列に変換
print $name, ' (', $addr, ")\n"; # link-local (169.254.0.0)
}
なお、getnetent
は Windows では機能しませんので注意してください。