「初めてのPerl」 4章 (サブルーチン)

そこそこ良いペースで勉強が進んでいる気がしているbonlifeです。この章で学んだのはsubで定義して&で呼び出すサブルーチンです。最後に評価された式の結果が自動的に戻り値になる、ってのに少し違和感があります。ここは注意しなきゃ。後、引数の渡し方も結構ルースですよね。なんでもかかってこい状態で、やってきたものを適宜処理する感じです。「不必要な制限を導入しない」哲学、恐るべし。レキシカル変数はしっかり使いこなさないとマズイですね。
では、演習問題です。今後はこの章で紹介されていたuse strictプラグマを使っていきます。
ex4-1.pl

  • 数値のリストを受け取って、その合計を返すサブルーチン&totalを書く
#! perl -w
use strict;
my @fred = qw { 1 3 5 7 9 };
my $fred_total = &total(@fred);
print "The total of \@fred is $fred_total.\n";
print "Enter some numbers on separate lines : ";
my $user_total = &total(<STDIN>);
print "The total of those numbers is $user_total.\n";
sub total {
	my $sum;
	foreach (@_) {
		$sum += $_;
	}
	$sum;
}

出力結果は以下の通り。

ex4-1.pl
The total of @fred is 25.
Enter some numbers on separate lines : 1
2
3
4
5
^Z
The total of those numbers is 15.

正解を見て気付いたことは特になし。
ex4-2.pl

  • 前の問題で作成したサブルーチンを使用して、1から1000までの合計を求めるプログラムを書く
#! perl -w
use strict;
my @number_list = 1..1000;
print &total(@number_list) . "\n";
sub total {
	my $sum;
	foreach (@_) {
		$sum += $_;
	}
	$sum;
}

出力結果は以下の通り。

ex4-2.pl
500500

正解を見て気付いたことは以下の通り。

  • 出力をもう少し分かりやすくする
  • 一時的にリストを配列に保存する必要はない (直接&totalにリストを渡すべき)

やはり分かりやすさに対する配慮が足りていないですね。気をつけなきゃ。後、必要以上に何でも箱(変数や配列)に入れたくなってしまう癖はPerlっ子っぽくないので直していこうと思います。おいおい、そりゃないぜ、的な記述を見つけた方はコメントにて教えてくださいませ。