From: Inaba Hiroto Date: 1999-05-28T10:25:30+09:00 Subject: [ruby-dev:7010] Re: ruby lacks some features of tr in Perl 稲葉です. Subject: [ruby-dev:7005] Re: ruby lacks some features of tr in Perl From: matz@netlab.co.jp (Yukihiro Matsumoto) Date: Thu, 27 May 1999 17:57:56 +0900 > まつもと ゆきひろです > > In message "[ruby-dev:6992] ruby lacks some features of tr in Perl" > on 99/05/25, Inaba Hiroto writes: > > |tr///dはString#delete、tr///sはString#tr_sとメソッドを用意しているのだ > |から、String#countというある範囲の文字の数を数えるメソッドがあってもい > |いと思いますが、どうでしょうか? > > 良さそうに思います.わたなべさんからは histgram は? という > 意見も出てるようですが,どのような仕様のメソッドが良いでしょ > うねえ. 個人的には, 単に範囲に含まれる文字数を返すだけでいいと思います. 文字数0の時nilにする事も考えられますが, nonzero?があるのでそうしなくて いいでしょう. # Perl5 の Todo に「リストコンテキストのtr///で histgramを返す?」とい # うのが(まだ)ありますね. これが無意識にあって「スカラーコンテキストで」 # なんて書いてしまったのかな. > # 1.3はfreezeしてるので1.4以降ですね. OKです. > |2.rubyのString#deleteはPerlのtr///dでできる「ある範囲に含まれある > |範囲に含まれない」文字の削除ができません。 > | % perl -le '$_ = "123456789"; tr/2-8/4-6/d; print' > | 14569 > > deleteがoptionalな2番目の引数を持てば良いようですね.そうし > ようかな. Perlのtr///dの移植にはそれで十分ですが, 任意個の引数を持てるようにして 対象範囲はそれらのANDとするのはどうでしょう. 上で提案したString#count もそうできますね. ruby -e 'p "123456789".delete("2-8", "^4-6")' # => "14569" 2引数までに限るとしても, ANDの方がわかりやすいと思います. -- 稲葉 浩人