読者です 読者をやめる 読者になる 読者になる

akimachoのはてなブログ

ICTとデザインのためのブログ

Perlのリファレンスによる複雑なデータ表現メモ1

イントロ

前回の記事の続きです.今回は"リファレンスを使いこなして複雑なデータを表現したり操作出来る"という項目を確認したいと思います.なのでリファレンスについて簡単にまとめていきます.


Perlのプリミティブなデータ表現メモ - むすんでひらいて

リファレンスとは

リファレンス(reference,参照)とは,スカラー・配列・ハッシュ・サブルーチンのメモリアドレスを表す値のことです.また,リファレンスが指すものをリファレント(referent,参照対象)と呼びます.そして,リファレンスが指す値を調べることをデリファレンス(dereference,参照解決)と呼びます.

プリミティブなデータの場所を表すリファレンスもスカラーの仲間なので,スカラー変数に代入することができます.では,スカラーのリファレンス,配列のリファレンス,ハッシュのリファレンスを1つずつ見ていきましょう.

スカラーリファレンス

スカラー変数にスカラーリファレンスを代入します.

my $num = 5;#変数numを宣言し,5を代入する
my $num_ref = \$num;#numのリファレンスをnum_refに代入する.
# 次のように書くこともできる
my $num_ref = \5;

スカラーリファレンスのデリファレンス

スカラー変数の名前の前に'$'をつけることで,スカラーリファレンスを格納した変数をデリファレンスします.

my $num = 5;
my $num_ref = \$num;
print "address : ", $num_ref, "\n";
print "value : ", $$num_ref, "\n";

実行すると,以下のような結果が出力されます.

address : SCALAR(0x7fb06b8284d8)
value : 5

ちゃんとスカラーリファレンスがデリファレンスされていると分かりますね.

配列リファレンス

スカラー変数に配列リファレンスを格納します.

my @array = (1, 2, 3);#配列を宣言し,リスト(1,2,3)を代入
my $array_ref = \@array;#array_refに変数arrayのリファレンスを代入
# 次のように書くこともできる
my $array_ref = [1, 2, 3];

配列リファレンスのデリファレンス

スカラー変数の名前の前に'@'をつけることで,デリファレンスができます.

my @array = (1, 2, 3);
my $array_ref = \@array;
print "address : ", $array_ref, "\n";
print "value : ", @$array_ref, "\n";

実行すると以下のような結果が出力されます.

address : ARRAY(0x7f8f18828490)
value : 123

配列リファレンスがデリファレンスされ,リストが返されていると分かると思います.

次は要素へのアクセス.

my @array = (1, 2, 3);
my $array_ref = \@array;
print $$array_ref[0], $$array_ref[1], $$array_ref[2], "\n";
#次のように書くこともできる
print $array_ref->[0], $array_ref[1], $array_ref->[2], "\n";
print @{$array_ref}[0..2], "\n";

実行してみると以下のように出力されます.

123
123
123

リストが返されていますね.

ハッシュリファレンス

スカラー変数にハッシュリファレンスを格納します.

my %hash = ('a' => 1, 'b' => 2, 'c' => 3);ハッシュにリストを代入する.
my $hash_ref = \%hash;#hash_refに変数hashのリファレンスを代入
#次のように書くこともできる
my $hash_ref = {'a' => 1, 'b' => 2, 'c' => 3};

ハッシュリファレンスのデリファレンス

スカラー変数の名前の前に'%'をつけることで,デリファレンスができます.

my $hash_ref = {'a' => 1, 'b' => 2, 'c' => 3};
print "address : ", $hash_ref, "\n";
print "value : ", %$hash_ref, "\n";

実行すると,次のようになりました.

ddress : HASH(0x7fba430032b8)
value : c3b2a1

$hash_refにはリファレンスが,valueにはキーと値が対応したリストが返されています.

では,キーを使ってアクセスしてみましょう.

my $hash_ref = {'a' => 1, 'b' => 2, 'c' => 3};
print "a => ", $$hash_ref{'a'}, "\n";
print "b => ", $$hash_ref{'b'}, "\n";
print "c => ", $$hash_ref{'c'}, "\n";
#次のように書くこともできる
print "a => ", $hash_ref->{'a'}, "\n";
print "b => ", $hash_ref->{'b'}, "\n";
print "c => ", $hash_ref->{'c'}, "\n";
print @{$hash_ref}{'a', 'b', 'c'}, "\n";

実行すると,こうなります.それぞれのキーに対応した値を取り出すことができました.

a => 1
b => 2
c => 3
a => 1
b => 2
c => 3
123

おわりに

深沢千尋さんの"すぐわかるオブジェクト指向Perl"という本で,リファレンスについて勉強しました.この本は,MATSUMOTOさんが書いた人間とウェブの未来 - Linuxエンジニアを目指して入社一年目にやって役にたったと思う事という記事をみて購入を決めました.

すぐわかる オブジェクト指向 Perl

すぐわかる オブジェクト指向 Perl