Devel::Bayside このページをアンテナに追加 RSSフィード

2008-04-30

配列と連想配列とリファレンス

|  配列と連想配列とリファレンスを含むブックマーク

配列連想配列ハッシュ)と配列リファレンスハッシュリファレンスの書き方が全部異なるのが、Perl を異界の呪文に見せている原因だと思います。正直自分も時々忘れますし、全部 Array で済む PHP のほうが最近は好きです(PHP5の話、PHP4はたぶん一生使いません)。

関数内で中身を書き換えたいときはリファレンスにして渡します。配列連想配列ハッシュ)のまま関数に渡すと値が全部展開されてコピーされるので、メモリーもすごく食うし、時間もすごくかかります。通常はリファレンスで扱ったほうがいいと思います。

ただ、リファレンス配列連想配列ハッシュ)として扱いたいときは @$array や %$hash とデリファレンスしてやらなければならないので、これはこれで面倒くさいですが・・・。

結論:Perl は使うな(笑)

ちなみにスカラースカラーリファレンス関数関数リファレンスもあります(汗)。リファレンスは C 言語ポインターのようなものと考えるとすっきり理解できます(使い方もほぼ一緒)。

配列

my @array = ('a', 'b', 'c');
my $val1 = $array[0];
push(@array, 'd');

連想配列ハッシュ

my %hash = ('a' => 1, 'b' => 2, 'c' => 3);
my $val1 = $hash{'a'};

配列リファレンス

my $array = ['a', 'b', 'c'];
my $val1 = $array->[0];
push(@$array, 'd');

または

my @array1 = ('a', 'b', 'c');
my $array2 = \@array1;
my $val1 = $array2->[0];

ハッシュリファレンス

my $hash = {'a' => 1, 'b' => 2, 'c' => 3};
my $val1 = $hash->{'a'};

または

my %hash1 = ('a' => 1, 'b' => 2, 'c' => 3);
my $hash2 = \%hash1;
my $val1 = $hash2->{'a'};