改行のみのテキストファイルを作る

空の行(改行のみの行)が数十行あるだけのテキストファイルが急に欲しくなったので、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")を生成しているとか? それは無いか。