Perlでそのまま書くと
# IPアドレス一覧を読み込んでのようなコードになるのですが、ソートが文字列の比較になっちゃうので一工夫必要になります。
foreach (<>) {
chomp;
push(@ipaddr, $_);
};
# 出力
foreach (sort @ipaddr) {
print;
};
こういった場合、一旦IPアドレスを整数値に変換してから処理するとうまい具合ソートできるんですが。(文字列のまま全て3桁にしてもいいけど)
# IPアドレス一覧を読み込んでちょっとスマートじゃない気が。
foreach (<>) {
chomp;
# 一旦数値データに変換して格納
push(@ipaddr, hex(sprintf("%02%02%02%02", split(/./, $_))));
};
# 出力
foreach (sort @ipaddr) {
# 数値データを16進数の文字列に変換して、オクテット毎切り出して10進数で表示
printf "%d.%d.%d.%d",
hex(substr(sprintf("%08X",$_), 0, 2)),
hex(substr(sprintf("%08X",$_), 2, 2)),
hex(substr(sprintf("%08X",$_), 4, 2)),
hex(substr(sprintf("%08X",$_), 6, 2));
};
ビット演算子を使って
# IPアドレス一覧を読み込んでのほうか一見スマートなんですが、、、ちょっとPerlっぽくないし。
foreach (<>) {
chomp;
# 一旦数値データに変換して格納
push(@ipaddr, hex(sprintf("%02%02%02%02", split(/./, $_))));
};
# 出力
foreach (sort @ipaddr) {
# 数値データを16進数の文字列に変換して、オクテット毎切り出して10進数で表示
printf "%d.%d.%d.%d",
($val >> 24) & 0xff,
($val >> 16) & 0xff,
($val >> 8) & 0xff,
$val & 0xff;
};
実際、どっちが速いんでしょうかね。。。
コメント