From: Fujisaki <fujisaki / elf.coara.or.jp>
Subject: [ruby-list:39705] 最後だけが
Date: Tue, 1 Jun 2004 21:56:22 +0900

るびきちです。

> puts  list が巧くいきません。
> 最後の1行だけがでます。
「巧くいきません」とはどういう処理がしたくてどういう結果が欲しいのですか?

> #!/usr/local/bin/ruby
> #     
>  list  = []
>   Filename = "eki.d" 
>   fd = open(Filename)
>   while (st_list = fd.gets)     ←*
>     list  << st_list    ##  sotoni   
>   end
>  fd.close
(snip)
>  # 線 駅を分けるが ダメ 
>  # 最後の1行だけ 何故か判らない   
>   for  list in split(' ')  
>      puts   list  
>   end  
> 

split(' ')は$_.split(' ')のことです。$_は*のgetsで読み込んだ行が格納さ
れています。最後に読み込んだ行が$_に格納されているため、そういう結果に
なるのです。Ruby的にはあまり$_に頼らない方がいいと思います。わかりにく
いので。Rubyの場合処理の対象(レシーバ)と処理(メソッド)が組になって
いるので処理が明確です。

あ、もしかして、スペースで区切られたそれぞれの要素を1行1行表示したいの
でしょうか?ならばこれでしょうか? 実質一行です。

Filename = "eki.d" 
puts File.read(Filename).split(/\n/).collect{|list| list.split(' ')}

File.readでファイルの内容を丸ごと文字列として読み込み(自動でクローズもして便利)、
その文字列をsplit(/\n/)で改行ごとに区切るとそれぞれの行が格納された配列が返り、
その配列の要素各々において(1つ1つの要素をlistという変数にすると)、
list.split(' ')でスペースで区切ります。
この時点で配列の配列ができあがっています。
それをputsで出力するとその配列の配列の要素を1行ずつ表示します。
この際、自動でArray#flattenがかかっていると考えるとわかりやすいかもしれません。

また、ファイルの内容をそのまま表示するだけなら、
File.read(Filename).display
あるいは
print File.read(Filename)
だけでできてしまいます。

ここまで書いてみましたが、冒頭に言ったようにどういう処理がしたくて、ど
ういう結果が欲しいのかが読み取れなかったので期待している結果ではないか
もしれません。

なお、ここに出てきたメソッドはすべて基本的なものなので自由自在に使いこ
なせるようになりましょう。

るびきち☆
http://www.rubyist.net/~rubikitch/ ←Ruby大衆化計画@移転