Perlがくしゅう帳(Rubyも)

プログラミングの勉強会の参加記録や学んだことなど。 twitter ID : @tomcha_で活動しています。 最近は主にPerl関連の勉強会やコミュニティに参加しています。移転前のブログはこちら->http://ruby.doorblog.jp/

perlのリファレンス、値渡し、参照渡しについて

今月はperl入学式に参加したり、kansai.rbに参加したりPerlRubyの勉強会に参加しました。

perlのリファレンス、初心者には少しとっつきにくい仕組みだと思うのですが、単純なサンプルコードで書いてみると分り易いのかな?と思いブログを書いてみました。

RubyPerlの2つの言語で書いてみました。上段が値を渡す方法、下段が参照を渡す方法です。 やっている事は、配列変数(配列オブジェクト)を作って、それをもう一つの配列変数(配列オブジェクト)に代入して、代入した方をいじると元がどう変化しているか、出力してみるコードです。値渡しと参照渡しで結果が違うので、それを試してみるとよくわかると思います。

まずはRuby

次にPerlPerlは参照を渡す方法=リファレンスという仕組みです。

いずれの言語も、値を渡す方法なら、元は変更に影響されず[0, 1, 2]が出力されます。そして、参照を渡す方法なら、元のデータが変更されてしまい[0, 'a', 2]となります。

値渡し->コピーを渡す、参照渡し->データの在処を渡す、の違いですね。

例えるなら、学生時代に授業で書いたノートを試験前に友人に・・・

  • コンビニでコピーしたものを渡す(値渡し)ー>友人がコピーにいくら落書きしても自分のノートは元のまま。
  • 自分のノートが仕舞ってあるロッカーの番号を書いた紙を友人に渡すー>友人が自分のロッカーのノートを見に来て、それに落書きすると、当然自分のノートがぐちゃぐちゃになる。

といった感じでしょうか。

比較して面白かったのは、一番素直に単純にコードを書くと、Rubyの場合はデフォルトが参照渡しとなり、値渡しをするためには.dupというメソッドを使用する必要が出てくること、Perlの場合はデフォルトが値渡しとなり、参照渡しをするためにはリファレンス(デリファレンス)を使う必要があり、言語によって真逆でした。 これはどちらが良いというよりは、最終的にはどの言語を選んでも「値渡し、参照渡し」の概念はしっかり理解しておかないと、意図しない動きをするバグを含んだコードを書いてしまう可能性があるということです。

perlの場合は初期の段階にリファレンスを覚える必要があり、割とそこがハードルになるのですが、遅かれ早かれ身に付ける必要がある概念ですので、簡単なコードでしっかり身につけましょう。