Perl5 perldata - Perl のデータ構造
[変数名][コンテキスト][スカラ値][スカラ値の構成][リスト値の構成][データ型]
変数名
Perl には、スカラ、スカラの配列、「ハッシュ」とも呼ばれるスカラの連想配列という 3 つのデータ構造があります。
通常の配列は 0 を基点とする数値でインデクスされます。
(負の添字は、配列の終わりからインデクスします。)
ハッシュ配列は、文字列でインデクスされます。
スカラ値の参照は、配列の一要素であるスカラを参照する場合でも、 常に名前に '$' を付けます。 以下のようなものが使えます:
$days# 単純なスカラ変数 "days" の値 $days[28] # 配列 @days の 29 番目の要素の値 $days{'Feb'} # ハッシュ %days の 'Feb' の値 $#days # 配列 @days の最後のインデクス値
ただし、配列全体や配列のスライスは '@' で示します:
@days        # ($days[0], $days[1],..., $days[n])
@days[3,4,5]    # @days[3..5] と同じ
@days{'a','c'}   # ($days{'a'},$days{'c'}) と同じ
ハッシュ全体は '%' で示します:
%days# (key1, val1, key2, val2,...)
さらに、サブルーティンは名前の前に '&' を付けて示しますが、曖昧にならなければ、(英語でもほとんど使われなくなった "do"のように) 省略することができます。
シンボルテーブルのエントリは、名前に '*' を付けて示すことができますが、使用に際しては十分に注意する必要があります。

変数のすべての型には、それぞれの名前空間があります。
衝突を心配せずに、スカラ変数、配列、ハッシュ (ついでにファイルハンドルやサブルーティン名、ラベル) に、同じ名前を付けることができます。 つまり、$foo と @foo は 2 つの異なる変数であるということです。
また、$foo[1] は @foo の一部であって、$foo の一部ではありません。
奇妙に思えるかもしれませんが、それで良いのです。奇妙なのですから。

変数と配列の参照は、いつも '$'、'@'、'%' で始まりますから、「予約」語は、変数名としては、本当の意味で予約されているわけではありません。
(しかしながら、先頭に特別な文字を付けない、ラベルやファイルハンドルとしては、予約されていることになります。
たとえば、"log" といった名前のファイルハンドルを使うことはできません。
ヒント:
open(log,'logfile')
    などではなく、
open(LOG,'logfile')
    としてください。
大文字のファイルハンドルを使えば、読みやすくもなりますし、将来に渡る予約語との衝突も避けられます。)
大文字と小文字は区別されますから、"FOO"、"Foo"、"foo" は、すべて違う名前です。
英字と下線で始まる名前は、名前の一部に数字や下線を含むことができます。

そのような英数字の名前を、その型のオブジェクトへのリファレンスを返す式で置き換えることも可能です。
詳しくは、perlref manpage を参照してください。

数字で始まる名前には、数字しか含めることができません。
英字、下線、数字以外の文字で始まる名前は、"$%" や "$$" のように 1 文字に限定されます。
(これら 1 文字の名前の多くは、Perl があらかじめ意味を定めています。
たとえば、$$ はカレントプロセスのプロセス id を示します。) (訳注: $^A など 2 文字が続く変数が Version 3 の終わり頃から、いくつかできています。
ただし、^A の 2 文字を control-A の1 文字 (16 進数の 0x01) で置き換えることも可能です。)

出典:Perl manpages Last change: Release 5.0 Patchlevel 00 5