人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Rubyのワンライナー上でのスクリプトについて質問です。

ファイルfoo.txtのn行目からm行目までを表示するワンライナーで、

$ cat foo.txt | ruby -ne 'print if n..m'

という書き方をよく目にします。

このワンライナー中でRubyの実行スクリプトの部分は、
省略せずに書くと、どのようになるのでしょうか?

特に範囲オブジェクトが、何に作用しているのかがわかりません。

ファイルfoo.txtのなかで正規表現にマッチする行を表示するワンライナー

$ cat foo.txt | ruby -ne 'print if /bar/'

は、

while gets()
print $_ if $_ =~ /bar/
end

だと思うのですが、
できればこのような形で示していただけると助かります。


初歩的な質問で申し訳ありませんが、よろしくお願いします。


●質問者: kenk
●カテゴリ:コンピュータ
✍キーワード:BAR GETS print Ruby txt
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● るびきち
●30ポイント

ん、実行しても素通りするだけですが?

$ wc -l ~/.emacs
200 /m/home/rubikitch/.emacs
$ cat ~/.emacs | ruby -ne 'print if 2..4' | wc -l
200
◎質問者からの返答

Rubyのバージョンが結構古かった(1.8.1)のですが、

そのへんも影響しているのでしょうか。

手元の環境では、以下のようにできました。

[kanouk@rhel ~]$ ruby -v

ruby 1.8.1 (2003-12-25) [i386-linux-gnu]

[kanouk@rhel ~]$ cat .cshrc | wc -l

32

[kanouk@rhel ~]$ cat .cshrc | ruby -ne 'print if 2..5' | wc -l

4

違う環境(1.8.6)で試してみたら、

おっしゃる通り素通りしました。


2 ● komamitsu
●30ポイント

> $ cat foo.txt | ruby -ne 'print if n..m'

Perlだとそのまんまでいけますけど、

Rubyの場合、確かにそのままじゃいかんすねぇ(いけるバージョンあるのかなぁ)。

komamitsu@onion:~/caml$ wc -l tree.ml

13 tree.ml

komamitsu@onion:~/caml$ cat tree.ml | perl -ne 'print if 2..4' | wc -l

3

komamitsu@onion:~/caml$ cat tree.ml | ruby -ne 'print if 2..4' | wc -l

13

特殊変数 $. の値を比較してあげればいいから、適当にこう?

komamitsu@onion:~/caml$ cat tree.ml | ruby -ne 'print if (2..4).include? $.' | wc -l

3

ちなみに、Perlのほうは、

暗黙的に $. との比較を行っている、みたいな。


3 ● しおり
●30ポイント

何か抜けてませんか?

こんなのならわかりますが。

$ cat foo.txt | ruby -ne 'print if ($.==2)..($.==4)'
line 2
line 3
line 4

範囲式 - 条件式としての範囲式:

条件式として範囲式が用いられた場合には、状態を持つ sed や awk 由来の特殊な条件式として振る舞います。

「..」の場合:

  1. 初期状態では式1だけを評価し、式1が真を返すまでは false を返します。
  2. 式1が真を返すと true を返します。式2が真なら初期状態に戻ります。
  3. この後は式2だけを評価し、式2が真を返すまで true を返します。
  4. 式2が真を返すと true を返したあと、初期状態に戻ります。
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ