今月はperl入学式に参加したり、kansai.rbに参加したりPerlとRubyの勉強会に参加しました。
perlのリファレンス、初心者には少しとっつきにくい仕組みだと思うのですが、単純なサンプルコードで書いてみると分り易いのかな?と思いブログを書いてみました。
RubyとPerlの2つの言語で書いてみました。上段が値を渡す方法、下段が参照を渡す方法です。 やっている事は、配列変数(配列オブジェクト)を作って、それをもう一つの配列変数(配列オブジェクト)に代入して、代入した方をいじると元がどう変化しているか、出力してみるコードです。値渡しと参照渡しで結果が違うので、それを試してみるとよくわかると思います。
まずはRuby。
次にPerl。Perlは参照を渡す方法=リファレンスという仕組みです。
いずれの言語も、値を渡す方法なら、元は変更に影響されず[0, 1, 2]が出力されます。そして、参照を渡す方法なら、元のデータが変更されてしまい[0, 'a', 2]となります。
値渡し->コピーを渡す、参照渡し->データの在処を渡す、の違いですね。
例えるなら、学生時代に授業で書いたノートを試験前に友人に・・・
- コンビニでコピーしたものを渡す(値渡し)ー>友人がコピーにいくら落書きしても自分のノートは元のまま。
- 自分のノートが仕舞ってあるロッカーの番号を書いた紙を友人に渡すー>友人が自分のロッカーのノートを見に来て、それに落書きすると、当然自分のノートがぐちゃぐちゃになる。
といった感じでしょうか。
比較して面白かったのは、一番素直に単純にコードを書くと、Rubyの場合はデフォルトが参照渡しとなり、値渡しをするためには.dupというメソッドを使用する必要が出てくること、Perlの場合はデフォルトが値渡しとなり、参照渡しをするためにはリファレンス(デリファレンス)を使う必要があり、言語によって真逆でした。 これはどちらが良いというよりは、最終的にはどの言語を選んでも「値渡し、参照渡し」の概念はしっかり理解しておかないと、意図しない動きをするバグを含んだコードを書いてしまう可能性があるということです。
perlの場合は初期の段階にリファレンスを覚える必要があり、割とそこがハードルになるのですが、遅かれ早かれ身に付ける必要がある概念ですので、簡単なコードでしっかり身につけましょう。