Rubyで外部コマンドとの連携がどれくらい簡単にできるかを試してみました。
今回はlsで表示されるファイルを正規表現でマッチさせて、マッチしたファイルをファイル名の長い順に
ソートし、長い方から5つを表示させるプログラムを書きました。
と言ってもたったの1行です。
コードを下に示します。
p `ls`.split("\n").grep(/^e/).sort_by { |file| -file.length }.take(5)
# >> ["echo-client.rb", "echo-server.rb", "each_names.rb", "eightqueen.rb", "ex2601.erb"]
では解説をしていきます。
Rubyでは`(バッククォート)で外部コマンドを囲むだけで実行できます。
ここではlsをバッククォートで囲んでいます。
次のsplitですが、lsの実行結果は文字列で、またファイルをそれぞれ改行(\n)で区切っています。
ですのでsplitの区切り文字として\nを指定することで、ファイルの一覧を配列で得ることができます。
この配列に対してgrepを呼ぶことで、正規表現にマッチした配列の要素を抽出できます。
例ではファイル名の初めの文字がeのファイルを抽出しています。
次にsort_byを呼んでいますが、file.lengthに付いているマイナスに注目してください。
ここでマイナスを付けないと、ファイル名の短い順にソートされます。
最後にtakeを呼ぶことで引数に指定した数字分、配列の先頭から要素を取り出しています。
説明が長くなりましたが、これだけのことをRubyでは簡単に行うことができます。
メソッドチェインの強力さを改めて実感しました。
寝る前に思いついてささっと書いたので間違いがあれば指摘お願いします。