リファレンス
次何しようかなと思っていろいろみてたらこんな記述があって
$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も関数ポインタがあったしなるほどなと。
そうなると、サブルーチンの引数に配列わたしたり出来るなというわけでやってみようと思ったが、まだサブルーチンに引数をわたすのをやってなかった。
というわけで次はサブルーチンへの引数のわたしかたの巻。