IPアドレスのソート

IPアドレスの一覧をソートする(というかサマライズする)必要があって、コード書いて訳ですが、


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アドレス一覧を読み込んで
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;
};
のほうか一見スマートなんですが、、、ちょっとPerlっぽくないし。
実際、どっちが速いんでしょうかね。。。