From: matz@... (Yukihiro Matsumoto) Date: 1997-09-04T11:19:27+09:00 Subject: [ruby-list:4097] Re: [Q] 文字列処理 まつもと ゆきひろです In message "[ruby-list:4096] [Q] 文字列処理" on 97/09/04, Yasunari Momoi writes: |ももちゃん@あるもにこすです. | |ずいぶん前から ML にはいたんですが,ようやく最近プログラムを |はじめました (^^;).時々質問すると思うので,今後もよろしくお |願いします (_ _). おひさです. |# field-a, field-b は全部取り出す. |# (元の文字列の状態を保存する) |# field-d は取り出した後に加工したい. | |target = [] |lines.each { | |l| | if (l =~ /^field-a: /) | target << l | elsif (l =~ /^field-b: /) | target << l | elsif (l =~ /^field-d: /) | line = l.clone | # なんか書換える | target << line | end |} |やっぱこのくらいしかないのかなぁ... There's More Than One Way To Do It.ですよ target = [] lines.each {|l| if (l =~ /^field-[ab]: /) target << l elsif (l =~ /^field-d: /) line = l.clone # なんか書換える target << line end } で,ちょっと短くなりますね.正規表現を使わないなら target = [] lines.each {|l| case l[6] when ?a, ?b target << l when ?d line = l.clone # なんか書換える target << line end } なんてのもありえるかも. 例のための例としては target = [] line = nil proc1 = lambda{target << line} proc2 = lambda{ なんか書き換える target << line } action = {?a => proc1, ?b => proc1, ?d => proc2} lines.each do |line| action[line[6]].call end なんてのはどうでしょう? # 本当は入力チェックをした方が良いですけど あと,大体は書き換える操作の中でコピーが行われますから,明示 的なcloneは不必要なことが多いと思います. まつもと ゆきひろ /:|)