In message <199903091600.BAA02510.keiju / bc.mbn.or.jp>
keiju / Rational.Com (石塚圭樹 ) writes:

> >`.' によるマッチは `\n' を乗り越えて進んでいくような.
> 
> そうか. どれだとよいんですね.

「どれ」?


> str = "foo\nbar\nbaz\n"
>     ==>"foo\nbar\nbaz\n"
> str =~ /.*$/; str = $'
>     ==>"\nbar\nbaz\n"
> str =~ /.*$/; str = $'
>     ==>"\nbar\nbaz\n"
> 
> こういう風にすると駄目なんですね....

`.*' は空文字列にもマッチするからでしょうね.先頭から greedy にマッチ
をとると最初の空文字列にまっちしてしまう.

# 「から,空文字列にマッチするようなパターンは避けた方が良いでしょ
# う.」ってどこかに書く事にしよう.


> ところで, もう1つきになる動作を発見しました(^^;;;
> 
> Scanner.newに文字列を渡した時の動作ってちゃんと確認しています?

ずばり,してません (^^; 実際最近の様子からすると石塚さんの方が利用して
いる時間が長い用です (^^;


>   def scan
>     while true
>       begin
>         @__line__ = @__inf__.gets if @__line__.empty? and not @__inf__.nil?
>         return nil if @__line__.nil?   #1
>         while not @__line__.empty?
>           send @__mode__
>         end
>       rescue ScanReturn
>         return $!.val
>       end
>     end
>   end
> 
> @__line__ == "" だと, 無限ループにはいるような....

入りますね.りっぱに.

# りっぱじゃないない

たぶん #1 を `return nil if @__line__.to_s.empty?' にしたら動くんじゃ
ないかとは思いますが,むりして一行にまとめないでちゃんと書き下すって言
うのが真っ当な解決策でしょう.

# ここにきて `@__line__.to_s.empty? == true' であるなら
#   (@__line__ == "" and @__inf__.nil?) == true
# であるか
#   @__line__.nil? == true
# であるはず....って,だからちゃんと書きなさいってば (^^;


ついでに Scanner#feed(str) なんてなメソッドを追加して新しくします.あ
んまり遠くない未来になる事を希望しています.<< 他人事みたいないいぐさ

# Scanner#feed(str) は UNGETS の逆で,@__line__ << str をやるメソッド.
# String をスキャンする場合にいちいち新しいスキャナを作るのもどうかと
# 思って.....じつはべつに構わなかったりする?

-- 
柳川和久 @ 東大阪市 . 大阪府                                 March 10, 1999
アリオッチ,アリオッチ,血と魂を御身に捧ぐ!