Ruby でソート

ruby に限らず、スクリプト言語で sort を使うのは何年ぶりだろうか。昔は使っていたと思うのだが、最近はさっぱり。
 
sort が必要だと思うようなデータは大抵 Excel に取り込むCSVファイルだったり、データベース上にあるデータだったりしたので、途中のスクリプトで実行するなんてことはここ何年もありませんでした。
ちょうど無線LANのアクセスポイントのリストを整備してて、SNMP を介してコントローラからMACアドレスとIPアドレスを取り出しています。簡単なデータだし、後からExcel でソートするのも面倒だから、ソート済みのデータを出せばいいかな、と思ったのでスクリプトでやることにしました。
 
文字列の加工はやっぱり ruby がいいな、と思って途中まで作ったものの、rubyで
2次元の配列のソートってどうするんだろ?とふと不安に。実はこれまで書いたことがありませんでした。
簡単にネットで調べると、{ |a, b| a[0] <=> b[0] } とか書いてます。ruby でもこの辺りはよく解らず使っているので、何のことかさっぱりでした。まず「|a, b|」が何だか、解りません。単純な配列に対して .each はよく使うのですが、それと似たようなものでしょうか。でも、なんで変数が2つあるの?とか。
 
6月くらいに SAS のプログラムを調べていたころ、SQLもそうなのですが配列を
1つの変数のように扱うのは、C言語などをやってきた人には、理解しにくい概念
だ、みたいな記事があったのですが、まさにそんな感じです。
 
しかも、運の悪いことに、今回は比較すべき数値を文字列として配列に登録して
いました。なかなか思い通りの処理をやってくれません。
具体的に言うと、ちょうどこんな配列で

mac_ip= [
["MACaddress", "IPaddress" ],
["XX.XX.XX.XX.XX.XX", "???.???.???.100"]
["XX.XX.XX.XX.XX.XX", "???.???.???.10"]
["XX.XX.XX.XX.XX.XX", "???.???.???.1"]
]

IPアドレスの最後の8ビットを数値でソートしたい、というもの。
よく解らずにいろいろ試してしまったのですが、こんな処理で思ったとおりの結果が
得られました。
まず、ソートするキーを追加するので、配列を2つから3つに増やします。

mac_ip= [
["No", "MACaddress", "IPaddress" ],
["100", "XX.XX.XX.XX.XX.XX", "???.???.???.100"]
["10", "XX.XX.XX.XX.XX.XX", "???.???.???.10"]
["1", "XX.XX.XX.XX.XX.XX", "???.???.???.1"]
]

次のコマンドで sort を実行します。

ソート済配列名 = 配列名.sort { |a, b| a[0].to_i <=> b[0].to_i }

たぶん、[0] だから Excel に取り込むと1行目に “No” のラベルが付く配列を、a と b の2つの新しい変数に取り込み、数値として a と b を比較して sort を行う、という意味なんでしょう。
 
こういうのを1行で書けてしまうのは、やはり ruby のいいところ。
こんな Linux からみでデータ収集に使うような文字列の操作は、やっぱりruby に限る、と思います。