空の行(改行のみの行)が数十行あるだけのテキストファイルが急に欲しくなったので、Rubyで作ってみた。
ruby -e '30.times { print "\n" }' > test3.txt
見た目通り、何の捻りもない。
後でこんな書き方もあることに気づいた。
ruby -e 'print "\n" * 30' > test3.txt
改行30文字分の文字列を生成しているけど、効率的にどうなんだろう? 改行を1文字ずつ30回標準出力に書き込むのと、文字列を生成してから1回だけ書き込むのと。いや、最適化されるかもしれないから、一概には言えないのか。インタプリタ内部の挙動を全く知らないので判断できない*1。
実は最初gawkで書こうとしてたのだけど、眠かったからかうまくいかなかったのでRubyに変更した。改めてgawkでチャレンジしたらあっさりと書けてしまった。
gawk 'BEGIN { for (i = 0; i < 30; ++i) print "" }' > test3.txt # これでもOK。というかほとんど同じ。 gawk 'BEGIN { for (i = 0; i < 30; ++i) printf("\n") }' > test3.txt
同じようなコードを書いてた記憶があるのだけど、どこをどう間違えていたんだろうか? 自分でも謎だ。
調子に乗ってGaucheでも書いてみた。
# 最初にできたバージョン。本当は、 # 「改行のみのリストを作る→リストの各要素を出力する→改行される」 # という流れを考えてたんだけど……。 gosh -u srfi-1 -e '(for-each print (make-list 30 ""))' -e '(exit)' > test3.txt # 上のリベンジ版。printじゃなくてdisplayを使えばよかった。 gosh -u srfi-1 -e '(for-each display (make-list 30 "\n"))' -e '(exit)' > test3.txt # リストから文字列に変換して、1回だけ出力するバージョン。 gosh -u srfi-1 -u srfi-13 -e '(display (string-concatenate (make-list 30 "\n")))' -e '(exit)' > test3.txt
Schemeとか未だによく分からないので、変なコードかもしれない。
*1:まさか「print "\n"」の所で毎回オブジェクト("\n")を生成しているとか? それは無いか。