
311
6 章の練習問題の解答
このプログラムは問題
2
の解答とよく似ていますが、まず最初にカラム幅を入力してもらい
ます。最初にカラム幅の入力を求めるのは、システムによっては、ファイルの終わりに到達し
た後では、それ以上ユーザから入力してもらうことができないからです。もちろん、実世界で
は、ユーザから入力してもらう場合には、もっと良い方法でファイルの終わりを知らせてもら
うのが普通です。これについては、後ろのほうの解答でお見せします。
問題
2
のプログラムとのもう
1
つの違いは、物差しの表示です。ここではちょっと算数の力
を借りて、必要な長さの物差しを生成しています。これは、出題文の「追加点」をもらうため
のコードです。この計算が正しいことを証明するのも、ちょっとしたチャレンジでしょう(ヒ
ント:幅
50
文字と
51
文字の場合について考えてみましょう。
x
の右オペランドは四捨五入で
はなく、切り捨てられることに留意してください)。
この問題では、
"%${width}s\n"
という文字列によって、フォーマットを生成しています。こ
の文字列の中には、変数
$width
が展開されます。変数名
width
をブレースで囲んでいるの
は、その直後にある
s
と「絶縁」するためです。もしブレースがなかったら、間違って別の変
数
$widths
を展開しようとしてしまうでしょう。もしこのブレースを使った書き方を忘れてし
まっても、
'%' . $width . "s\n"
のような式を使えば同じフォーマット文字列が得られます。
ここでは、
$width ...