Sanmba の他にも Ruby を再学習しているところ。
たのしいRuby 第2版 Rubyではじめる気軽なプログラミング
の50ページにこんなソースが。
#read_txt.rb
filename = ARGV[0]
file = open(filename)
txt = file.read
print txt
file.close
これは read_txt.rb の引数(ファイル名)を
・開いて
・読み込んで
・出力して
・閉じる
っていう挙動をします。
read_txt.rbと同じ階層内に下記のようなファイルを置いて、
#abcd.txt
aaa
bbb
ccc
ddd
eee
で実行。
$ ruby read_txt.rb abcd.txt
#=>
aaa
bbb
ccc
ddd
eee
と出力されるわけなんですな。
でもなんかすっと落とし込めないんだよね。
実際に頭に入ってこない。
っていうのも
1. [ filename、file、txt なんて変数三つも使う理由 ]
2. [ もっと人間的な動作で例えられないのかな ]
という二点から。
実際に試してみる。
まずは1. filename、file、txt なんて変数三つも使う理由から。
先述したread_txt.rbでなるべく変数を使わないで書いてみる。
#kaitemita.rb
print open(ARGV[0]).read
open(ARGV[0]).close
で実行する。
$ ruby kaitemita.rb abcd.txt同じやーん。結局は見易さなの? いやいやそんなはずはない。変数使用の理由は絶対にあるはず。 そこで次の項で扱われている、getsメソッドを使用した gets_txt.rb と 変数を使わないバージョンを続けて書いて試してみる。
#=>
aaa
bbb
ccc
ddd
eee
#tsuduketekaita.rb###gets_txt.rb
filename = ARGV[0]
file = open(filename)
while txt = file.gets do
print txt
end
file.closeprint "\n===========","\n"#区切り
###変数なしで書く。
while open(ARGV[0]).gets do
print open(ARGV[0]).gets
end
open(ARGV[0]).close
実行
$ ruby tsuduketekaita.rb abcd.txt
#=>
aaa
bbb
ccc
ddd
eee
===========
aaa
aaa
aaa
aaa
aaa
(ループするのでCtr + Cで終了)
tsuduketekaita.rb:13: Interrupt
なんか挙動が違いますね。
終了時のメッセージを見ると13行目の処理を行っていたとこでしたとな。
これ何回か繰り返してメッセージをみてみるとわかると思いますけど、
とりあえず変数無しバージョンは while のところを延々と回ってるみたいですね。だからループするわけ。
そして "aaa" ばっかり出力されちゃうのは、毎回 open(ARGV[0]).gets しちゃうからなんですね。
つまり新しくファイルオブジェクトを open してから gets を繰り返すから最初の一行しか print されないんだわ。
で、ずっと一行目だから nil にならねーんでループってわけ。
んー納得、と思ったところでひらめき。もしやこういうこと?
#!/bin/bash
a=`date`
date
sleep 10
date
echo ${a}
なーるほどね。実行してみるべし。
おもったより長くなってしまったので
2. [ もっと人間的な動作で例えられないのかな ]
については次のエントリで。
ソフトバンククリエイティブ (2006/08/05)
売り上げランキング: 4000
トラックバック(0)
このブログ記事を参照しているブログ一覧: Ruby / filename、file、txt なんて変数三つも使う理由 / bash
このブログ記事に対するトラックバックURL: http://jippenshar.com/igc/mt/mt-tb.cgi/106



コメントする