リファレンス

次何しようかなと思っていろいろみてたらこんな記述があって

$ref_array = [1, 2, 3, 4, 5];

こんなのみたことないぞと思って調べてみたらリファレンスというものだった。

http://d.hatena.ne.jp/perlcodesample/20080201/1201884772

配列のリファレンス

* リファレンスとは、配列の入っているメモリの位置を指すもの
* C言語を知っているなら、「アドレス演算ができないポインタ」だと考える。
* Javaを知っているなら、「参照」だと考える。

リファレンスとリファレント

* 指されるほうをリファレントと呼び、指すほうをリファレンスと呼ぶ。

配列のリファレントの作成

* my $numbers_ref1 = \@numbers ;
* @の前に、\をつけると、配列のリファレントを作成できる。
* \@numbersがリファレントで、$numbers_ref1がリファレンス。

直接配列のリファレントを作成する

* my $numbers_ref2 = [ 1, 2, 3, 4 ];
* リストを [ ] でくくると、配列のリファレントになる。
* そして、そのリファレントを、リファレンス $numbers_ref2で指している。

配列の要素の参照

* $numbers_ref2->[0]
* 配列のリファレンス->[ 要素番号 ]

要はCのポインタみたいなもんらしい。
昔Cをちょろっとだけやったことがあるので大体の概念はわかってると思うんだが、こんなところでまた出会うとは思わなかった。

ここをみるとわかりやすい。

http://tech.bayashi.jp/archives/entry/perl/2008/002065.html

今回はここを参考にやってみる。

http://www.rfs.jp/sb/perl/02/10.html

#!/usr/bin/perl
use strict;
use warnings;


my $str = "ABC";
my $ref_str = \$str;
print "スカラー リファレンス -> $ref_str\n";
print "スカラー 中身 -> $$ref_str\n";

my @array = (1, 2, 3, 4, 5);
my $ref_array = \@array;
print "配列 リファレンス -> $ref_array\n";
print "配列 中身 -> @$ref_array\n";

my %hash = (key1 => "VAL1",
			key2 => "VAL2"
			);
my $ref_hash = \%hash;
print "ハッシュ リファレンス -> $ref_hash\n";
print "ハッシュ 中身 -> %$ref_hash\n";
C:\MyWorks\Perl\ref>perl ref1.pl
スカラー リファレンス -> SCALAR(0x1832414)
スカラー 中身 -> ABC
配列 リファレンス -> ARRAY(0x1853d10)
配列 中身 -> 1 2 3 4 5
ハッシュ リファレンス -> HASH(0x18533c8)
ハッシュ 中身 -> %HASH(0x18533c8)

ハッシュはそのままで中身を出せないようだ。

要素へのアクセス。

#!/usr/bin/perl
use strict;
use warnings;


my @array = (1, 2, 3, 4, 5);
my $ref_array = \@array;
print "配列 要素 -> $ref_array->[0]\n";
print "配列 要素 -> $ref_array->[1]\n";


my %hash = (key1 => "VAL1",
			key2 => "VAL2"
			);
my $ref_hash = \%hash;
print "ハッシュ 要素 -> $ref_hash->{key1}\n";
print "ハッシュ 要素 -> $ref_hash->{key2}\n";
C:\MyWorks\Perl\ref>perl ref2.pl
配列 要素 -> 1
配列 要素 -> 2
ハッシュ 要素 -> VAL1
ハッシュ 要素 -> VAL2

リファレンス経由で中身を書き換える。

#!/usr/bin/perl
use strict;
use warnings;


my $str = "ABC";
my $ref_str = \$str;
print "スカラー 中身 -> $$ref_str\n";
$$ref_str = "XYZ";
print "スカラー 中身 -> $$ref_str\n";


my @array = (1, 2, 3, 4, 5);
my $ref_array = \@array;
print "配列 要素 -> $ref_array->[0]\n";
$ref_array->[0] = 9;
print "配列 要素 -> $ref_array->[0]\n";
print "配列 中身 -> @$ref_array\n";


my %hash = (key1 => "VAL1",
			key2 => "VAL2"
			);
my $ref_hash = \%hash;
print "ハッシュ 要素 -> $ref_hash->{key1}\n";
$ref_hash->{key1} = "VAL9";
print "ハッシュ 要素 -> $ref_hash->{key1}\n";
C:\MyWorks\Perl\ref>perl ref3.pl
スカラー 中身 -> ABC
スカラー 中身 -> XYZ
配列 要素 -> 1
配列 要素 -> 9
配列 中身 -> 9 2 3 4 5
ハッシュ 要素 -> VAL1
ハッシュ 要素 -> VAL9

サブルーチンもリファレンスがあるということでみてみたら

http://d.hatena.ne.jp/lolstep/20080621/1214043186

これでやった無名関数がまさにそれだった。
そういえばCも関数ポインタがあったしなるほどなと。

そうなると、サブルーチンの引数に配列わたしたり出来るなというわけでやってみようと思ったが、まだサブルーチンに引数をわたすのをやってなかった。

というわけで次はサブルーチンへの引数のわたしかたの巻。