Saturday, August 7, 2010

learning perl exercise 5

5-3
#! /usr/bin/perl
use 5.010;

print "how many digits?\n";
chomp ($digit = <STDIN>);
print "input a word\n";
chomp ($word = <STDIN>);

if ( $digit > 10) {
 $digit_of_scale = ($digit/100)*12 ;
 #10桁目以上なら1.2倍の桁数があればいいかなと。。。wrong!
 #と、思っていたけど小数点以下が切り捨てられるので16以下だとnot working...
 print "$digit_of_scale\n"; #check用
 }
 elsif ($digit < 10 && $digit > 0) {
 $digit_of_scale = 1;
 #10以下であれば10桁で足りる。文字数が10越えたら桁数たりない。
 }
 else {
 die "oops that was not a valid number.";
}
say "1234567890" x $digit_of_scale;
printf "%${digit}s\n", "$word"; # スカラー名を{}で囲む

回答例を見る前に作ろうと思ってできなかったものを回答例を見て整えた。回答例は複数の文字を受け付ける仕様になっていた。

できていなかった部分
・chompを忘れていた。
・&ではなくて&&。
・printfでフォーマット付き出力時で桁数をスカラーで代入する時は$のあとのスカラー名を{}で囲む。

これだと文字数が10文字以上の長い単語だと桁数が足りなくなる。


やり方の例検証

5-2
キーボード入力を配列に代入。foreachですべての要素を20桁フォーマットでprintf。

またはforeachを使わない方法
my $format = "%20s\n" x @lines; #フォーマットは20行の文字x要素数
printf $format, @lines; #そのフォーマットに要素を代入してprint

5-3
桁数を自動で増やす部分。
自分で思いついたのは1.2倍というアイデアだったが、小数点以下が切り捨てられるので16以下だと1(つまり10桁)足りない!

必要とされる数字は入力された桁数の10の位に1足したもの。つまり9足して10で割る、ということになるのか。これだと10以下をわざわざ1に固定する必要もない。なるほど。
print "1234567890" x (($digit+9)/10), "\n";

ファイルハンドルとか初めて聞く言葉が増えてきた。
ペースも落ちて落ちこぼれ気味。。。

間隔開けないように続けていくことが大事。

ファイルハンドル

Perlプロセスと外部の世界の間のI/O(インプットアウトプット)の結びつきに対してPerlプログラムがつけた名前のこと。ファイル名ではない。大文字推奨。

No comments:

Post a Comment