2009年4月30日木曜日

文字の切り詰めメソッド 追記

先日投稿した文字の切り詰めメソッド、先輩社員さんに間違いを指摘されて編集。
すいませんでしたm(_ _)m

新しいソース上げました。

以下にためになったことを書きます。

日本語を分割するときは文字のエンコードを指定してsplit

文字の切り詰めを行うときに、改行コードを変換しながら切り詰めを行うので改行コードが入っていないかを確認しながら処理。
その際、文字コードを指定していないと日本語(2バイト文字)が1バイトずつ分割されるみたい。

なので、

# $KCODE = "NONE"
str = "あああ"
str.split(//)

=> ["\202", "\240", "\202", "\240", "\202", "\240"]

$KCODE = "SJIS"
str = "あああ"
str.split(//)

=> ["あ", "あ", "あ"]

文字コードをSJISに指定してあげると日本語をうまく識別して切り取ってくれます。

破壊的メソッドと破壊的でないメソッド

オブジェクトの内容を変えてしまうメソッドを破壊的メソッドという。
一般的に波形的メソッドはメソッド名の最後に!マークをつける。

str = "あああ\nあああ"
str.gsub(/\n/, "")
str

=> "あああ\nあああ"

str = "あああ\nあああ"
str.gsub!(/\n/, "")
str

=> "ああああああ"

ちなみに

str = "あああ\nあああ"
str.gsub(/\n/, "")

=> "ああああああ"

てっきりstrが置換されたかのように思えるけど戻り値が表示されてるだけなのね。

str = "あああ\nあああ"

のままなので注意。

正規表現は前から順番に

改行コードを\lt;br\gt;タグに変換する処理があります。その時の注意。

str = "一行目\r二行目\n三行目\r\nラスト"
str.gsub(/\r|\n/|\r\n,"<br>")

=> "一行目<br>二行目<br>三行目<br><br>ラスト"

str = "一行目\r二行目\n三行目\r\nラスト"

str.gsub(/\r\n|\r|\n/,"<br>")

=> "一行目<br>二行目<br>三行目<br>ラスト"

gsubの正規表現の条件で, "\r"と"\n"、"\r\n"がかぶっている部分があるので注意。
先に変換してほしい"\r\n"の条件を先に書かないと2重変換される。

問題解決の際には原因特定からやりましょう。

これが一番大事なことだとですね。
ある問題があった時に、原因と思われる個所を"予想して"解決するのは効率が悪い。
明確に原因と思われる個所を"特定して"そこを中心に原因を探る。

急いでいるときには特に"予想して"解決しようとする癖が強い。

急がば回れ。
あせらず急ぐ。

大事な考え方ですね。

0 件のコメント: