プロが教える店舗&オフィスのセキュリティ対策術

現在、業務でperlプログラムを書いてます。
perlを初めて2か月、プログラムは ほぼ初です。
よろしくおねがいします。

例えば以下のようなコードで、「sub_func」というメソッド内で「main」メソッド内の配列データを直接編集したいのですが、うまくいきません。

これは、引数で渡しているのは配列の「ポインタ」ではなく「リファレンス」であるため、「sub_func」というメソッド内で、新たに「array_ref」という配列の実態を作成してしまっているのだと認識しています。
そのため、「main」メソッドに戻ったタイミングではデータは元に戻ってしまうのだと思っています。





sub sub_func {
   my ($self, $array_ref) = @_ ;
   $array_ref = [4,5,6];   # returnはせずに、引数で指定したデータに格納したい
}

sub main {
   my ($self) = @_ ;

   # メソッドに渡すデータ
   my $data = {
      array => [1,2,3],
   };
   my $data2 = [1,2,3];
   my @data3 = (1,2,3);

   # メソッドの中で、$data->{array}を [4,5,6] に変えたいが・・・
   $self->sub_func( $data->{array} );
   $self->sub_func( $data2 );
   $self->sub_func( \@data3 );

   # この時点で、どれも [1,2,3] のまま
}



私の認識は間違っているのでしょうか??
また、どのようにすれば配列の要素を別のメソッド内で編集できるのでしょうか??
御助言をお願いします。

A 回答 (1件)

(ぼそ) 「ポインタ」と「リファレンス」は同じものだと思っていい (endぼそ)


現状では
サブルーチン sub_func で引数をいったん変数 $self, $array_ref にコピーし, この「コピーした」$array_ref を書き変える
という動作です. コピーした時点で $_[0] と $self, $_[1] と $array_ref は「同じ値を持つ別の変数」です. だから, サブルーチン main の変数はどれも変化しません.
ちなみに $_[1] = [4, 5, 6]; だと @data3 以外は書き変わります. まあ, これも妥当かな.
ということで
@$array_ref = (4, 5, 6);
では?
    • good
    • 0
この回答へのお礼

Tacosanさん、ご回答ありがとうございます。
「ポインタ」と「リファレンス」は多少違うものと認識していたので、こういったところで違ってくるのかと思ってました・・・。
$self, $_[1] と $array_ref は「同じ値を持つ別の変数」というのは認識していたのですが、なぜ引数で渡したアドレスをそのまま参照してくれないのか不思議でなりませんでした。

ご指摘の件、試してみたところ、正常に動作するようになりました。
ありがとうございました。

お礼日時:2009/08/06 14:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!