目次
はじめに
Perlを勉強するにあたり、一番最初につまづいた部分となります。
多分ポインタ
という言葉をご存じであればここは難なくいけると思うのですが。。
早速やっていきましょう
リファレンスとは
変数の中のアドレスを参照して変数に格納することです
アドレスとは、例えば
果物(1) | 野菜(2) | 肉(3) |
---|
例え)
枠ひとつに対して()に番号が振られているテーブルがあります。
このテーブルにそれぞれ果物、野菜、肉という名前の変数名を付けました。
このテーブルがコンピュータのメモリといい、果物名に表記されている番号の呼び名がアドレスです。
リファレンスとはアドレスを格納している変数を作るということです。
果物(1) | 野菜(2) | 肉(3) |
---|---|---|
(1)(4) | (2)(5) | (3)(6) |
なお、通常の変数を関数などに渡す場合、変数の中身をそのままコピーして渡すことになります。
少し語弊がありますが、一度作成した変数を再度コピーして関数に使うという挙動になります。
それに比べてリファレンスは、変数をコピーせずアドレスを参照して渡してくれるので、処理が軽くなります。リファレンスをするメリットの一つとしてこういった背景があるんですね。
リファレンスの種類
リファレンスはスカラ値, 配列, ハッシュに適応することができます。
Perlの変数については【Perl初学者】Perlの変数宣言を見てもらえればと思います。
スカラ値
my $apple = 'りんご';
my $scalar = \$apple;
print "$scalar\n";
#結果
#SCALAR(0x7fbe2b8148b8)変数のアドレス
配列
my @food = ('果物','野菜','肉');
my $array = \@food;
print "$array\n";
#一気にリファレンス化したい場合(無名配列生成子)
my $array = ['果物','野菜','肉'];#[]を使用
#結果
#ARRAY(0x7fbe2b814858)変数のアドレス
ハッシュ
my %foods = (
'果物' => 'りんご',
'野菜' => 'すいか',
'にく' => '豚',
);
my $hash = \%foods;
#一気にリファレンス化したい場合(無名ハッシュ生成子)
my $array = {
'果物' => 'りんご',
'野菜' => 'すいか',
'にく' => '豚',
};#{}を使用
print "$hash\n";
#結果
#HASH(0x7fbe2b8148d0)変数のアドレス
デリファレンスとは
リファレンスの反対の意味で、リファレンスした変数の中身を取り出すという意味
ここで大事なことは、リファレンスと同じように、中身をコピーせずに済むので処理速度が速くなります。
デリファレンスの種類
スカラ値
my $dscalar = $$scalar;#先ほどリファレンス化した値,処理が複雑な場合は変数を{}で囲む
print "$dscalar\n";
#結果
#りんご
配列
my @darray = @$array;#先ほどリファレンス化した値,処理が複雑な場合は変数を{}で囲む
print "@darray\n";
#結果
#果物 野菜 肉
ハッシュ
my %dhash = %$hash;
$, = "\n";#この特殊変数を設定するとハッシュの配列1つ1つが改行される
print %dhash;
#結果
#果物 りんご 肉 ぶた 野菜 すいか
#ハッシュの文字列は順番を保持しないので注意
まとめ
このようにリファレンスとデリファレンスは使用する際のメリットが大きく、使われる頻度も多いと思うのでセットで覚えておくといいかもしれません、閲覧ありがとうございました。