「初めてのPerl」 10章 (さまざまな制御構造)

通勤中に音楽を聴くのがこんなに楽しいなんて!アメリカ旅行中に買った「Mastering Regular Expressions: Understand Your Data and Be More Productive」を読み終えるのがどんどん遅くなりそうな気がしているbonlifeです。ER-6i、なかなかのフィット感。勉強の秋。ということでプログラミングのお勉強を加速させようと思ってます。とりあえず「初めてのPerl」、いい加減終わらせます!10章で扱っている内容はだいたい以下のような感じです。

  • unless制御構造
  • until制御構造
  • 式修飾子 (短い書き方)
  • elsif節
  • オートインクリメントとオートデクリメント (++とか--とか、プリとかポストとか)
  • for制御構造
  • foreach (セミコロンがなしのforはforeach)
  • last演算子、next演算子redo演算子
  • ラベル付きブロック
  • 論理演算子 (&&とか||とか)

この章は特に難しくなかったような気がしました。(気のせいかもしれません。)unlessとかuntilは使わなそうですね。読めればオーケーかしら。last、next、redoはキチンと使いこなしたいところ。後、論理演算子は優先度に気をつけたいですね。ということで、練習問題のbonlife的粗悪解答例です。
ex10-1.pl

  • 1から100までの間から選んだ秘密の数をユーザに当ててもらうプログラムを書く
  • 入力した値が当たるまで何回でも繰り返してユーザに入力を求める
  • 乱数を得るには int(1 + rand 100) を使う
  • ユーザの入力した数が当たらなかったら、"Too high"または"Too low"と表示する
  • ユーザがquitまたはexitと入力したり、空行を入力したら、プログラム終了
  • 数が当たった時にもプログラム終了
#! perl -w
use strict;
my $rand_number = int( 1 + rand 100 );
print "Please input a number between 1 and 100. : \n";
while (<>) {
	chomp;
	if ( /^quit$|^exit$|^$/ ) {
		print "Goodbye!\n";
		exit;
	} elsif ( ! /^[0-9]+$/ ) {
		print "Please input correct number.\n";
	} elsif ( $_ < 0 || $_ > 100 ) {
		print "Please input a number between 1 and 100.\n";
	} elsif ( $_ > $rand_number ) {
		print "Too high!\n";
	} elsif ( $_ < $rand_number ) {
		print "Too low!\n";
	} elsif ( $_ == $rand_number) {
		print "Congratulations!\n";
		exit;
	} else {
		print "Sorry, some errors may occur.\n";
		print "Please ask this program's author.\n";
		exit;
	}
}

出力結果は以下の通り。

ex10-1.pl
Please input a number between 1 and 100. :
50
Too high!
25
Too low!
37
Too low!
43
Too high!
40
Too low!
41
Congratulations!
ex10-1.pl
Please input a number between 1 and 100. :
quit
Goodbye!
ex10-1.pl
Please input a number between 1 and 100. :
exit
Goodbye!

解答例を見て気づいたことは以下の通り。

  • デフォルトで繰り返しを行う場合、whileを常にtrueにしておき、lastでループを抜ける
  • スペースだけの行も空行として扱う

Perlベストプラクティス」をちゃんと読み込んでキレイなコードを書けるようにしなきゃ。まぁ、ボチボチ頑張ります。

Perlベストプラクティス

Perlベストプラクティス