なんちゃってl33t文

コメントで指摘されて気づいた。String#gsubは文字列置換のためのメソッドだけど、置換後の文字列を省略すると、イテレータとして動作してブロックを評価した結果で置換を行う、とマニュアルにある。これは便利そうだ。というわけで、練習問題として、いわゆるl33tっぽい文章に変換するスクリプトを書いてみた。大文字と小文字を意図的に混ぜて書く、子どもっぽいワナビーギークの文体というか。

#!/usr/bin/ruby
while line = gets
  print line.gsub(/(\w)/){|chr|
    if rand > 0.5
      chr.upcase
    else
      chr.downcase.gsub("e","3")
    end
  }
end

mAN IS Th3 SysTEm'S MAnUal paGER. 3aCh pAgE ARGuMEnT GIvEN to MAN Is noRmallY tHE nAM3 Of A pROgrAM, uTilITY or FunCtiOn. thE mAnuaL pAGE aSSociatED wiTh Each of th3s3 arGUM3NtS is tH3n foUnD AnD dISpLaY3D. A sEctIoN, iF provId3d, will diREct maN To LOok ONLY IN ThAT S3ctiON Of Th3 mANuAl. THE dEfaulT ActIoN IS to sEARCH In aLl oF ThE AVAIlABlE SEcTIoNS, foLloWing a prE-d3fIn3D ORd3r aND To show onlY th3 firSt pagE fOUNd, Ev3n IF pAG3 ExisTS In s3v3ral SECTioNS.

ブロックの中からは明示的に引数を受け取ることもできるけど、組み込み変数を使っても同じこと。

#!/usr/bin/ruby
while line = gets
  print line.gsub(/(\w)/){
    if rand > 0.5
      $&.upcase
    else
      $&.downcase.gsub("e","3")
    end
  }
end

これは便利かも。