masatoz’s blog

プログラミングのメモ、日常の記録

初めてのPerl 練習メモ 第5章 入出力

なんでもブログに書くといいことがあると聞いて、雑でもいいから勉強の記録をUPしてみることにします。 今日は「初めてのPerl」の練習問題をやりました。5章 入出力です。

問1.

やりたいこと

標準入力で入力した文字列をおしりから頭に向かって逆順にプリント。 複数行入力した場合は、一番最後の行から最初の行に向かってプリントする。

use strict;
use warnings;

# tacプログラム:入力した文字列を逆にプリントする
# Satoshi Takashi Hisanori みたいに半角スペースで区切ってタイプする
chomp(my $in = <STDIN>);
if (length($in) == 0) {
    die $!;
}

my @names = split(/ /, $in);
for my $name (reverse @names) {
    my $rev = reverse($name);
    print $rev,"\n";
}

結果

入力

Satoshi Hisashi Takatoshi

結果

ihsotakaT
ihsasiH
ihsotaS

問2.

やりたいこと

10文字で右揃えにしてプリントする。 たとえば、'hoge'4文字ならスペースを6文字追加してからプリントする。

use strict;
use warnings;

print "Input strigs. If you want to finish, type 'q'.";

my @str = ();
while (my $input = <STDIN>) {
    print "next:\n";
    if (chomp($input) ne 'q') {
        push (@str, $input);
    }

    if ($input eq 'q') { last; } 
}

my $scale = '123457890';
print $scale x 5,"\n";

for my $str (@str) {
    my $len = length($str);
    my $space = ' ' x (9 - $len);
    print "$space$str\n";
}

問3.

やりたいこと

問2の拡張版。右揃えにする文字数の幅を標準入力から指定できるようにする。 たとえば、30字でそろえたい場合、はじめに30と入力してから、それ以降に文字列をタイプする。

use strict;
use warnings;

my @str = ();
my $c = 0;

print "Input strigs. If you want to finish, type 'q'.";
print "Hon many columns you want?\n";
my $column_number = 0;

while (chomp(my $input = <STDIN>)) {
    if ($c == 0) { 
        $column_number = $input;
        print "Input next:\n";
        $c++;
    } else {
        print "Input next:\n";
    }
    
    if ($input ne 'q') {
        push (@str, $input);
    } elsif ($input eq 'q') {
        last;
    }
}

my $scale = '123457890';
print $scale x ( $column_number),"\n";

shift(@str);
for my $str (@str) {
    my $len = length($str);
    my $space = ' ' x ($column_number -1 - $len);
    print "$space$str\n";
}

ところどころ結構ヘンなところがあるけど、練習ということでそのままにしておく。