« 半角/全角の変換 | トップページ | サブルーチンの引数としてハッシュを渡す Perl »

2007-08-20

サブルーチンの引数として配列を渡す Perl

サブルーチンの引数配列を渡します。
通常のサブルーチン呼び出しに、
配列を渡すとどうなるでしょう。
つまり、値渡しという形で引数を渡します。
配列ではなくハッシュを渡すには、
サブルーチンの引数としてハッシュを渡すをご覧ください。
sub receive_array
{
  my ($param) = @_;

  foreach (@{$param}) {
    print "$_\n";
  }
}

@array = (
  "item0",
  "item1",
  "item2",
  "item3",
  "item4");

&receive_array(@array);

サブルーチンreceive_arrayは、
引数に渡された配列を全て出力します。
しかし、上記のコードでは出力されません。
サブルーチンreceive_arrayを呼出す際の、
引数@arrayが値で渡されています。
そこで、配列参照渡ししてみます。
参照渡しとは、値渡しが変数の値をコピーするのに対し、
渡された変数を直接参照します。
イメージとしては、サーバからファイルをダウンロードして、
ダウンロードしたファイルを編集するか、
サーバー上のファイルをtelnetクライアントなどで、
直接編集するかの違いのような感じです。
または、書類などをコピーして、コピーした書類に書き込むか、
コピーせず、直接書類に書き込むかの違いです。
イメージできたでしょうか。
つまり、引数に渡した値は、値渡しの場合には、
呼出し元には影響しませんが、
参照渡しの場合には、影響してきます。
参照渡し配列を渡し、
この配列の内容を変更する事ができます。
戻値として配列の代入を行う必要が無いのです。
参照で渡すには、\(バックスラッシュ)をつけます。
バックスラッシュは、環境によって円マークで表示される場合もあります。
&receive_array(\@array);
とすると、各行にitem0~item4までを出力します。
それでは、配列の要素の値が変更されるかどうかを
調べてみたいと思います。
sub receive_array
{
  my ($param) = @_;

  foreach (@{$param}) {
    print "$_\n";
    $_ =~ tr/[a-z]/[A-Z]/;
  }
}

@array = (
  "item0",
  "item1",
  "item2",
  "item3",
  "item4");

&receive_array(\@array);

print "\n";
foreach (@array) {
  print "$_\n";
}
どうでしょう。
小文字のitem0~item4の下に、
大文字でITEM0~ITEM4と表示されたと思います。
どうやら、$_配列の各要素への参照のようです。
配列の要素の値を変更したくない場合には、注意が必要です。
参照で渡された配列を、
別の配列にコピーして利用する事が必要になります。
例えば、以下のようになります。
sub receive_array
{
  my ($param) = @_;
  my (@myArray) = @{$param};

  foreach (@myArray) {
    $_ =~ /[a-z]/[A-Z]/;
    print "$_\n";
  }
}
上記のサンプルでは、
参照で受け取った配列をmyArray配列にコピーします。
そして、大文字への変換はコピーされた配列に対して
行うので、receive_array関数に渡した@arrayは、
上書きされません。
参照は、通常のスカラー変数、ファイルハンドル、配列、ハッシュ(連想配列)など、
ほとんど全ての物に利用できます。
また、参照を利用する事で、サブルーチンを配列に格納したり、
連想配列に格納したりする事も可能になります。

|

« 半角/全角の変換 | トップページ | サブルーチンの引数としてハッシュを渡す Perl »

Perl」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: サブルーチンの引数として配列を渡す Perl:

« 半角/全角の変換 | トップページ | サブルーチンの引数としてハッシュを渡す Perl »