第6章 入出力の基本 練習問題

何も言わずに練習問題。だって、ねむいんだもんよ。あぁ、外が明るくなってきた。

1. 出力が逆になるcatっぽいプログラムtacを作る

ともかく、

use strict;

my @lines = <>;
print reverse @lines;

と書いてみたけど、これでも生温かった。

use strict;
print reverse <>;

これで十分!reverseの引数はリストコンテキストだからなだいじょぶだわなぁ。

2. 文字列を20文字幅のカラムに右寄寄せで表示

use strict;
print '1234567890' x 4, "\n";
while(<>) {
    chomp;
    printf "%20s\n", $_;
}

C言語のprintfっぽいので楽ですよ。chompをちゃんとしないと、改行文字の分だけ文字列の位置が左にずれます。やってたらLarryに怒られました。

3. 2.のカラム幅を指定できるようにする

use strict;

print "input the number of column: ";
chomp(my $n_column = <>);

my $ruler = '1234567890';
my $n_ruler = 4;
while ($n_column > $n_ruler * 10) {
    $n_ruler += 1;
}

print $ruler x $n_ruler, "\n";
while(<>) {
    chomp;
    printf "%${n_column}s\n", $_;
}

一行目にカラムの長さを書いてそのあとに単語を一行ずつ書いたファイルの使います。%${n_column}sのブレースをはずすと$n_columnsに見えるのでダメ。

解答を参照すると、うちが、

while ($n_column > $n_ruler * 10) {
    $n_ruler += 1;
}

として得ている$n_rulerを、($n_column+9)/10で得ている。クール。