リファレンス

Perlのリファレンスについて


リファレンスとは参照の意味で、まぁ、Perlでもほぼそのままの意味合いで使われています。

何をどう参照するか、といえば、「変数をアドレス値から扱う」と書けばわかりますでしょうか。

はい、そうですね。C言語を扱ったことがある人は、大体の人の脳裏に悪夢という名の幻想がよぎる方もおられるでしょうが、Cのポインタに似たやり方ですね。

さて、C言語のポインタを覚えた人にはわかりますが、「この参照(ポインタ)を利用することによってなんの利益が生まれるんだ」という質問が必ずと言っていいほど出ます。

おなじみですね。「速くて軽い」んです。

それは、作るプログラムの規模が大きくなればなるほど、利用価値は高まります。

一応この文章は中級者向けとなっておりますので、自分のレベルが、入門者や初心者だと思う人は、基礎を覚えていなければただ書き方を乱すことに成ってしまうので、読まないことを推奨します。最低限、変数のスコープファイルの入出力サブルーチンが理解できなければだめです。

さて、話を元に戻します。


まず、アドレス値とは、URLで言うドメイン名のようなものです。

ドメイン名は、元々は「192.168.0.1」のように、0~255までの数字を4つ、ドットで区切った数字の羅列なのです。が、「それでは覚えにくい!」ということで、名前をつけました(いや、私がつけたのではないけれども)。

変数もまた同じで、変数は元々16進数(わからない人はグーグル校長に聞いてくださいw)であらわされる、変数の住所に名前を付けただけです。

アドレスは、英語の綴りで「address」です。コレを翻訳機で翻訳するか、辞書で引いてみてください。意味どおりの意味が出てくるはずです。

「で、なんなん?はよう使い方教えろや」

まぁ、文章をだらだら書いてても仕方ないですね。

コードにします。

my @num = (0 .. 1000); # 0~1000までのリストを作り、配列に代入

number(\@num);         # (1)

sub number {           # (1)のサブルーチンの宣言と定義
        my $ref_num = $_[0];   # (2)
        
        @{$ref_num} = (1001 .. 2000); # (3)
}

はいはい、意味がわかりませんね。少なくともリファレンスを理解していない人はですけども。

まず、サブルーチンの説明ですね。

このサブルーチンは、渡されたアドレスの指す配列に、1001~2000のリストを作成し、そのまま代入します。


では、(1)から説明しましょう。

なぜだか、配列変数の前に、円マークがついてますね。これが、リファレンスです。

「はぁい?」

正確に言えば、numberというサブルーチンに、配列「num」のアドレス値を第一引数として渡します。

簡単に言えば、サブルーチンに配列の住所を教えます。

この円マークは、リファレンス演算子(参照演算子)といい、大体変数の前につけて、その変数のアドレス値を返します。

どんな方法でもいいので、

my @array;
print \@array;

とでもしてみてください。

ARRAY(0e4f36d)

みたいに表示されるはずです(括弧の中の数値は、環境によって違います)。

これを、サブルーチンの引数として渡してます。

何の意味があるんでしょうか。


(2)を見てください。

変数に、引数を代入しています。

つまり、先ほど書いたようなアドレス値が$ref_numに代入されるわけです。

「だから、何の意味があんの?」


というわけで、(3)です。

@{$ref_num}

意味がわからないようですが、@{}の間にさっきのアドレス値の代入された変数を入れただけです。

これが、デリファレンスです。

この{}の前の@の文字は、入っているアドレス値の種類によって分けなければなりません。

普通のスカラー変数の場合であれば、スカラー変数であるというしるしであるドルマーク「$」、配列であればアットマーク「@」です。

上級者くらいになれば使うようになりますが、たまにサブルーチンのアドレス値を渡す場合があります。

そのときも同様円マークをつけて引数として渡すのですが、気をつけるべきは、必ずサブルーチンであると言うしるしである、アンパサンド(一般的にアンドマーク)「&」をつけて、その前に円マークをつけることです。

アンパサンドをつけないと、実行してしまいます。

デリファレンスの場合も、&をつけます。

デリファレンスすると、その元の変数と等しく扱うことができます。


はい、というわけで、ここからは自分たちで色々と試してみるよーに。

C言語の経験者、ヒープだとかメモリリークとかは心配しなくてかまいません。もしC++を扱ったことがあるならば、そのリファレンスと同じ感覚です。

頭でわかってもダメです。

説明を聞いて全てを理解することは、不可能です。

百聞は一見にしかずという、すばらしいことわざがあるように、とりあえず自分の目で結果を見るしか覚える方法はありません。

習うより慣れろです。

失敗は成功の元です。

失敗してください。

そして、成功を学んでください。


はい、というわけで以上です。

「おいおい、随分テキトーだなぁ」



※ページの一番下に、wikipediaにのっているリンクが…

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2008年03月12日 22:45