なんちゃって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
これは便利かも。