akimachoのはてなブログ

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

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

f:id:akimacho:20150303201535j:plain

イントロ

前回に引き続き,リファレンスについて見ていきます.


Perlのリファレンスによる複雑なデータ表現メモ1 - むすんでひらいて



名前修飾

まずPerlの処理系がどのように変数を解釈するのかを知っておきましょう.

  1. 名前を見つけたら,まず名前の前を見る
  2. 名前の前に何か付いているときは,それを内側(最も後ろ)から解決する
  3. 前に付いているものが全部解決したら,名前の後ろを見る
  4. 後ろに何か付いているときは,それを内側から(最も前)から解決する

深沢千尋,"すぐわかるオブジェクト指向Perl", p.79, 技術評論社, 2008.

2次元配列

リファレンスを使って2次元配列を表現してみます.

# 配列の要素に配列リファレンスを格納する
my @mat = (
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
);

次に,2次元配列の要素にアクセスします.

# 行列の1行1列の要素にアクセスする
print 'matの1行1列目の要素 : ' , "${$mat[0]}[0]\n";#=>1
print 'matの1行1列目の要素 : ' , "$mat[0]->[0]\n";#=>1
print 'matの1行1列目の要素 : ' , "$mat[0][0]\n";#=>1

いずれも,1と表示されます.

最後に,配列全体にアクセスしてみましょう.

# 配列をスカラーコンテキストで評価してもらい,
# 要素数を返してもらいます
my $row = @mat; # 配列matの要素数 = 行数
my $column = @{$mat[0]}; # 配列mat[0]の要素する = 列数
print "row : $row\n"; # => 2
print "column : $column\n"; # => 3

配列が入れ子になったリファレンス

my %deadline = ( 
    'プロ演第2回目レポート'         => [12,  2, 2014],
    '情報工学実験I第3回目レポート' => [11, 25, 2014],
    '電気回路中間試験'              => [11, 19, 2014],
    '複素関数論中間テスト'          => [12, 12, 2014],
    'クリスマス'                    => [12, 25, 2014],
    '後期定期試験'                  => [ 1, 29, 2015],
    '春休み'                        => [ 2,  9, 2015],
    '2038年問題'                    => [ 1, 19, 2038],
    '東京オリンピック'              => [ 7, 24, 2020],
);

このハッシュは,イベント名をキーに,その日時の配列リファレンスを値としています.ちなみに本当にあるイベントです.(;´Д`)

さて,後期定期試験が何年何月何日にあるか取り出してみましょう.

# $deadline{'後期定期試験'}の配列リファレンスをデリファレンスし,
# リストを返してもらう
my ($month, $day, $year) = @{$deadline{'後期定期試験'}};
print "後期定期試験は", "$year$month$day 日", "にあります.\n";

実行してみると,無事取り出せていることが分かります.

後期定期試験は2015 年 1 月 29 日にあります.

終わりに

リファレンスにはまだ慣れていなくて,名前修飾の順をたぐりながらデリファレンスをしている状態です.なので間違ったことを書いているかもしれないので,自分の手で確かめてみてくださいね.

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

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