引数を任意の変数に格納
サブルーチン側では、呼び出し元から渡されてきた引数をデフォルトの配列変数「$_」に格納します。このまま使用しても問題はありませんが、サブルーチン内で使用する時にどのような値が格納されたものなのか分かりにくい変数名となっているため間違いをしやすく可読性も悪くなっています。
そこでサブルーチンでは渡されてきた引数を任意の引数に一度格納する処理がよく行われます。では実際の例で考えてみましょう。
&personal("加藤", 25, "東京都"); sub personal{ print "名前は $_[0] です¥n"; print "年齢は $_[1] です¥n"; print "住所は $_[2] です¥n"; }
引数は3つ使用されていますのでサブルーチン内では$_[0]から$_[2]で参照しています。これくらいのプログラムなら問題はありませんが、複雑な処理をサブルーチン内で記述する場合には$_[0]や$_[2]ではどんな値が格納されているか分かりにくいため間違えやすくなります。そこでサブルーチンの冒頭で渡されてきた引数を適切な変数に一度格納します。
&personal("加藤", 25, "東京都"); sub personal{ my ($name, $old, $address) = @_; print "名前は $name です¥n"; print "年齢は $old です¥n"; print "住所は $address です¥n"; }
ここでは特に特別なことをしているわけではありません。配列変数に格納された値を別途用意した変数に格納しているだけです。ただ適切な変数名を持つ変数を使用することで間違えにくく分かりやすいプログラムを記述できます。
引数が1つの場合の注意点
引数が1つだけだった場合には注意が必要です。例えば次のように記述してしまうと予期せぬ結果となります。
sub personal{ my $name = @_; }
変数「$name」に対して配列である「@_」を格納しています。配列を単独の変数に格納した場合、配列の要素数が変数に格納されてことになっていますので、この場合は引数の値が何であっても変数「$name」には引数の数である「1」が格納されます。
引数が1つの場合の正しい記述方法は次の通りです。
sub personal{ my $name; ($name) = @_; }
この場合は、要素が1つのリストに対して配列を格納しています。よって変数「$name」には配列の1番目の要素である「$_[0]」の値が格納されます。もちろん下記のように宣言と同時に格納しても構いません。
sub personal{ my ($name) = @_; }
サンプルプログラム
では簡単なプログラムで確認して見ます。
use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; &personal("加藤", 25, "東京都"); sub personal{ my ($name, $old, $address) = @_; print "名前は $name です¥n"; print "年齢は $old です¥n"; print "住所は $address です¥n"; }
上記を「test5-1.pl」の名前で保存します(文字コードはUTF-8です)。そしてコマンドプロンプトを起動し、プログラムを保存したディレクトリに移動してから次のように実行して下さい。
( Written by Tatsuo Ikura )