続・はじめてのPerl 4章

今日もまとめなんです。。。

4章 リファレンス入門

4.1 多くの配列に対して同じ処理を実行するには
サブルーチンに配列を渡す
    サブルーチンで、渡された配列に要素の追加は行えない
        それを行うためにリファレンスを使う
4.2 配列へのリファレンスを取るには
バックスラッシュ文字は多くの意味を持つ
    「〜へのリファレンスを取る」演算子でもある
        配列名の前に\を付けると、配列へのリファレンスが取得できる
            配列へのリファレンスは、ポインタのようなもの
                配列を指すが、配列そのものではない

リファレンスは、スカラーと同じコンテキストで使える
    つまり、
        ・スカラー変数に代入できる
        ・配列の要素にできる
        ・ハッシュのキーと値にできる

リファレンスは、コピー可能
    リファレンスの数値形式
        内部データ構造が持つ一意なメモリアドレス

    リファレンスの文字列形式
        メモリアドレスの16進表現を含んだ文字列
            つまり、配列ごとに一意

    リファレンスをコピーしたものと比較すると、真となる

リファレンスから、元の配列を得るには
    デリファレンスを行う
my @sample = qw/ a b c /;

# スカラー変数への代入
my $reference = \@sample;

# 配列の要素にリファレンスを指定
my @list = ( $reference );

# ハッシュのキーと値にリファレンスを指定
my %hash = ( $reference => $reference );

# リファレンスのコピー
my $second_reference = $reference;

# リファレンスの数値形式
printf( "%d, %d\n", $reference, $second_reference );   # 11249228, 11249228

# リファレンスの文字列形式
printf( "%s, %s\n", $reference, $second_reference );   # ARRAY(0xaba64c), ARRAY(0xaba64c)

# リファレンスをコピーしたものと比較
if ( $reference == $second_reference ) {
    print "ok\n";
}
4.3 配列リファレンスをデリファレンスするには
ブレースを使う
my @sample = qw/ a b c /;
my $reference = \@sample;

# print @sample, "\n"; と同義
print @{$reference}, "\n";

# print $sample[0], "\n"; と同義
print ${$reference}[0], "\n";
4.4 ブレースを省略してよいとき
リファレンスが...
    スカラー変数の場合省略可能
        @{$reference}    → @$reference
        ${$reference}[0] → $$reference[0]

    そうでない場合、省略不可能
        @{$_[0]}
            この場合、配列要素へのアクセス式
4.5 配列を書き換えるには
デリファレンスし、元の配列にアクセスし操作
4.6 ネストしたデータ構造
my @num_list = qw( 1 2 3 );
my @char_list= qw( a b c );

my @data = ( \@num_list, \@char_list );

# @num_listのリファレンスへのアクセス
print $data[0], "\n"; # ARRAY(0xaba64c)

# $num_list[0]へのアクセス
print ${$data[0]}[0], "\n";   # 1
4.7 矢印でネストした要素リファレンスをすっきりさせる
my @num_list = qw( 1 2 3 );
my @char_list= qw( a b c );
my @data = ( \@num_list, \@char_list );

# print ${$data[0]}[0]; は以下のように書ける
print $data[0]->[0], "\n";    # 1

# ブラケットの間に挟まっている、矢印は省略可能
print $data[0][0], "\n";  # 1

# 最初の矢印は、ブラケットで挟まっていないので省略できない
my $ref = \@data;
print $ref->[1][1], "\n"; # b

# 配列リファレンスから、配列全体にアクセス方法は1つのみ
print "@{$ref->[1]}", "\n";   # a b c
4.8 ハッシュへのリファレンス
my %hash = (
    a   =>  1,
    b   =>  2,
    c   =>  3,
);

# 配列と同じく、バックスラッシュ演算子を使う
my $hash_ref = \%hash;

# デリファレンスして元のデータへアクセス
#   1つめのブレースは、リファレンスを返す式を表す
#   2つめのブレースは、ハッシュキーを返す式を表す
print ${ $hash_ref }{ 'a' }, "\n";  # 1

# ハッシュ全体を操作する
my @keys = keys %{ $hash_ref };

# 配列の時と同じように、ブレースを外す事が出来る

# print ${ $hash_ref }{ 'a' }, "\n"; と同義
print $$hash_ref{ 'a' }, "\n";  # 1

# my @keys = keys %{ $hash_ref }; と同義
my @keys = keys %$hash_ref;

# 特定のハッシュ要素へアクセスするときは、矢印が使える
print $hash_ref->{ 'a' }, "\n"; # 1

# ハッシュリファレンスの配列
my %hash2 = (
    d   =>  4,
    e   =>  5,
);
my @data = ( \%hash, \%hash2 );

# @dataの1つめの要素の、'a' の値へのアクセス
my $ref = $data[0];
print $$data{ 'a' }, "\n";  # 1

print ${ $data[0] }{ 'a' }, "\n";   # 1

print $data[0]->{ 'a' }, "\n";  # 1

# ブレースとブラケットの間の矢印も省略可能
print $data[0]{ 'a' }, "\n";    # 1

# ハッシュリファレンスのスライス
@hash{ qw/ a b c / };   # ハッシュのスライス

@{ $ref }{ qw/ a b c / };   # ハッシュリファレンスのスライス
@$ref{ qw/ a b c / };       # ブレースを省略

感想

復習がメイン。
でも意外と忘れてることが多かった。省略形ばっかり使ってるからなぁ。
それと、リファレンスの数値形式は知らなかった。

続・初めてのPerl 改訂版

続・初めてのPerl 改訂版