@kyanny's blog

My life. Opinions are my own.

ワンライナーをもっと上手に書く余地がありそうだ

一行野郎(one-liner)はperlにおまかせ を読んだ。

  • MO=Deparse ってのがあるのか。これはワンライナーが思うように動かなくて悩むときに役立ちそう。一発で動かせないほど複雑なプログラムならワンライナーで済ませるべきではない、という意見もありそうだけど・・・。
  • a で awk っぽく、ってのも面白いけど、一番感心したのは最後の何気ない
% history | perl -nle'/perl/ and $p++;END{print $p}'

だった。

改行区切りのテキストファイルを一行ずつ読み込んで何かする場合に -n とか -p が便利なことは知っていたけど、たとえば各行が何かの数字で全部足したい、みたいなときに

$ cat numbers.txt | perl -nle '$n+=$_; print $n'

とやると計算途中の数字がずらずら出てきてダサイ。なので -e 'while(<>){ ... }' とかわざわざやっていたんだけど、 END ブロックを使えばいいのか。 END ブロックなんて全然使ったことがなかったしほとんど忘れていたしワンライナーで使えたりするものだとも思っていなかった。今後はこの書き方で覚えよう。

ついでに、 -l もついこの前まで知らなくて、各行ごとに何か変更をくわえて表示したい場合はわざわざ -e's/perl/ruby/g; print "$_\n"' なんてやっていた。クォートが入り組んで見づらいので print qq{$_\n} としてみてさらに難解な見栄えになったりしていたけど、これからはもっとすっきり書けそう。