Rubyワンライナーを使ってみる

スポンサーリンク

Rubyワンライナーをいろいろ使ってみます。

スポンサーリンク

集計

1列の集計

1列の集計です。

コマンド例

seq 10

実行結果

1列の集計(-nオプション使用)

値の初期化にBEGIN句を書くのが面倒なので、||=演算子を使用しています。

コマンド例

実行結果

2列以上の集計

それぞれの列に数字が絶対に必要です。

コマンド例

seq 10 | paste - -

実行結果

2列以上の集計(-nオプションと-aオプション使用)

特定の列に数字がない場合でも対応可能。数字がない場合は0が入ります。

コマンド例

実行結果

ネットワーク

HTMLの取得

ウェブサーバーにGETリクエストを送ります。

コマンド例

HTMLの解析

上のHTMLの取得したデータをnetfileという名前のファイルに保存して、Nokogiriで解析します。

コマンド例は、このサイトのトップページに表示されている記事のタイトルを表示します。

コマンド例

実行結果

Nokogiriのライブラリはインストールする必要があります。

詳しくは公式サイトのインストールページを確認してください。

外部リンク Installing Nokogiri - Nokogiri 鋸

ワンライナーのテクニック

自己代入(||=演算子)

rubyは未定義の値を使用するとエラーが出ます。
||=演算子は値が未定義の場合に何かの値を入れる場合に使用できます。初期化とかに便利です。

mapやinject

map(collect)やinject(reduce)はEnumerableモジュールにある機能で、ArrayクラスやHashクラスなどのオブジェクトの集まりで利用することができます。

mapの場合は、各要素に渡されたブロックの処理を行い、その結果を配列として返します。全ての要素に対して何かの操作を行いたい場合にとても便利なメソッドになります。
例えば、全ての文字列オブジェクトを数値オブジェクトに変換するには以下のようにできます。

コマンド例

実行結果

injectはリストの畳み込み演算を行います。
つまり、最初の要素と次の要素に対してある演算を行い、その結果に対して、さらに次の要素に対しても同じ演算を行っていき、その演算を行った最終的な結果を得たい場合に利用できます。

例えば、ある数値オブジェクトの配列に対しての合計の数値を求める場合は以下のようにできます。

コマンド例

実行結果

mapやinjectはブロックを引数に取ります。ブロックは、&をつけることで実引数として渡すことができます。
そこにシンボルでメソッドを渡すことで、ブロックで渡される引数自身が持つメソッドを呼ぶことができます。例えば、上のmapの例は単純に以下のようになります。

コマンド例

実行結果

配列の要素を変更

配列の特定の要素を変更したい場合はArray#fillが利用できます。用途としては集計後の要素を変更できます。Array#fillの構文は以下のようになります。

コマンド例

実行結果

参考

Rubyのドキュメント