Perl Hackers Hub

第7回 新人さんのための仕事で使えるPerl基礎知識(3)

この記事を読むのに必要な時間:およそ 4 分

ハッシュ

リファレンス

ハッシュのリファレンスも配列のリファレンスと同様に,変数に対してバックスラッシュを付けます。

my %hash = (
    'Blue' => '#0000FF',
    'Red' => '#FF0000',
);
my $hash_ref = \%hash;

無名ハッシュの場合は{}を使います。

$hash_ref = {
    'name' => 'Dog',
    'age' => 2,
};
デリファレンス

デリファレンスするにはリファレンスの変数名の先頭に%を付けてハッシュ全体として参照するか,アロー演算子を付けてハッシュのkeyを指定しハッシュリファレンスの一部を参照します。

my $hash_ref = {'name' => 'Hideo', 'age' => '40'};

print "My name is $hash_ref->{name}. \n";
print "I am $hash_ref->{age} years old. \n";
# My name is Hideo.
# I am 40 years old.

ハッシュのデリファレンスの際の書き方も3種類あり,次の例はどれも同じ結果になります。

print ${$hash_ref}{name}; # Hideo
print $$hash_ref{name}; # Hideo
print $hash_ref->{name}; # Hideo
%演算子を使ったデリファレンス

ハッシュの場合の全体像は次のようになります。

my $hash_ref = {'name' => 'Hideo', 'age' => '40'};

while ( ($key, $value) = each(%$hash_ref) ) {
    print "key: $key \n";
    print "value: $value \n";
}

実行結果は次のようになります。

key: name
value: Hideo
key: age
value: 40

サブルーチン

サブルーチンのリファレンスは次のように作ることができます。一般的に「コードリファレンス」と呼びます。

$foo = sub { print "hello!\n" };
$foo->(); # hello!

これは,ほかの言語でも使われるクロージャと呼ばれる使い方ができます。

my $foo = 'pen';
my $code = sub {
    print "This is a $foo"; # This is a pen
};

複雑なデータ構造の取り扱い

仕事で扱うデータ構造では,今まで挙げたような簡単なリファレンスが出てくることはありません。ぱっと見では何かわからない,複雑なデータ構造を扱わなければなりません。

ここでは,これから仕事上で使うかもしれない4種類のデータ構造を紹介します。これまでのリファレンスの内容を理解していれば,組み合わせるだけなので想像している以上に簡単です。

配列の中に配列リファレンスを入れる

配列の中に配列のリファレンスを入れることができます。

my @AoA = (
        [ "cat", "dog", "koala" ],
        [ "camel", "llama", "owl" ],
);
my $array_ref = \@AoA;

配列の中の配列のリファレンスにアクセスするための2つめ以降のアロー演算子は省略できます。

print $array_ref->[1]->[0]; # camel
print $array_ref->[1][0]; # camel
配列の中にハッシュのリファレンスを入れる

配列の中にハッシュのリファレンスを入れることができます。

my @AoH = (
    {
        name => "cat",
        age => 10,
    },
    {
        name => "dog",
        age => 5,
    },
  );

my $array_ref = \@AoH;

先と同様に,2つめ以降のアロー演算子は省略できます。

print $array_ref->[0]->{name}; # cat
print $array_ref->[0]{name}; # cat
配列のハッシュにアクセス

ハッシュのvalue要素に,配列のリファレンスを入れることもできます。

my %HoA = (
    animals1 => [ "cat", "dog", "koala" ],
    animals2 => [ "camel", "llama", "owl" ],
);

my $hash_ref = \%HoA;

print $hash_ref->{animals1}->[2]; # koala
print $hash_ref->{animals2}[1]; # llama
ハッシュのハッシュにアクセス

ハッシュのvalue要素に,ハッシュのリファレンスを入れることもできます。

my %HoH = (
    cat => {
        count => 10,
    },
    dog => {
        count => 5,
    },
);

my $hash_ref = \%HoH;

print $hash_ref->{cat}->{count}; # 10
print $hash_ref->{dog}{count}; # 5

著者プロフィール

横山彰子(よこやまあきこ)

大阪時代からWebシステム会社を数社経験後,2010年から本格的にフリーランスのエンジニアとして活動。現在もECサイト,新規サービスの立ち上げなどの開発支援を行う。

Perl Casual,Shibuya.pm,YAPC::Asia2010などスピーカーとして登壇。個人でも2008年からSmiley Hackathonやwebrick cafeなど勉強会の主催をしている。

Twitter:acotie

mail:acotie.acotie@gmail.com

URL:http://poccori.com