サブルーチンの引数を任意の変数に格納

引数を指定してサブルーチンを呼び出した場合、サブルーチン内ではデフォルトの配列変数「$_」の要素に引数の値が格納されます。このまま使用しても問題はないのですが、各引数を分かりやすい名前が付いた変数にまとめて代入しておきサブルーチンの中で利用することもできます。ここではサブルーチンの引数を任意の変数に格納する方法について解説します。

(Last modified: )

サブルーチンの引数を任意の変数に格納

サブルーチン側では、呼び出し元から渡されてきた引数をデフォルトの配列変数 $_ に格納します。このまま使用しても問題はありませんが、サブルーチン内で使用する時にどのような値が格納されたものなのか分かりにくい変数名となっているため間違いをしやすく可読性も悪くなっています。

そこでサブルーチンでは渡されてきた引数を任意の引数に一度格納する処理がよく行われます。では実際の例で考えてみましょう。

&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 つだけだった場合には注意が必要です。例えば次のように記述してしまうと予期せぬ結果となります。

&personal("田中");

sub personal{
  my $name = @_;
  print "名前は $name です\n";
}

変数 $name に対して配列である @_ を格納しています。配列を単独の変数に格納した場合、配列の要素数が変数に格納されてことになっていますので、この場合は引数の値が何であっても変数 $name には引数の数である 1 が格納されます。

引数が 1 つの場合の正しい記述方法は次の通りです。

&personal("田中");

sub personal{
  my $name;
  ($name) = @_;
  print "名前は $name です\n";
}

この場合は、要素が 1 つのリストに対して配列を格納しています。よって変数 $name には配列の 1 番目の要素である $_[0] の値が格納されます。もちろん下記のように宣言と同時に格納しても構いません。

&personal("田中");

sub personal{
  my ($name) = @_;
  print "名前は $name です\n";
}
サンプルコード

では簡単なプログラムで確認して見ます。

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 )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。