配列と連想配列とリファレンス
配列と連想配列(ハッシュ)と配列リファレンスとハッシュリファレンスの書き方が全部異なるのが、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'};