サブルーチンに渡された引数を任意の変数にまとめて格納する

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

(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, "東京都");
print "----\n";
&personal("園田", 31, "大阪府");

sub personal{
  my ($name, $old, $address) = @_;

  print "名前は $name です\n";
  print "年齢は $old です\n";
  print "住所は $address です\n";
}

テキストエディタでプログラムを記述したあと sample.pl という名前で保存します。(文字コードは UTF-8 です)。コマンドプロンプトを起動し、プログラムを保存したディレクトリへ移動したあとで次のように実行します。

perl sample.pl

次のように実行結果が表示されます。

サブルーチンに渡された引数を任意の変数にまとめて格納する(1)

サブルーチンに 3 つの引数を渡したあと、サブルーチンのブロック内で引数をそれぞれ変数に格納しました。

-- --

Perl でサブルーチンの引数を任意の変数に格納する方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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