配列とリストは、スカラーの順序付けられたコレクションです。参照を使う場合を除けば(参照は別の概念で扱います)、配列とリストは常にフラットです。つまり、他の配列やリストを含むことはできません。
ほとんどの場合、リストは括弧(())で囲み、要素はカンマ(,)で区切ります。
配列の変数には、通常、リストを代入して値を設定します。たとえば、my @names = ('Alice', 'Bob', 'Charlie'); のように書きます。
配列やリストの要素には、添字でインデックスを指定してアクセスできます。たとえば、('Alice', 'Bob', 'Charlie')[1] # 'Bob' です。
Perlのインデックスは0から始まります。負のインデックスは、配列やリストの末尾から数えます。たとえば、('Alice', 'Bob', 'Charlie')[-1] # 'Charlie' です。
配列やリストを操作するための関数が数多く用意されています。特によく使うのは、条件に一致する要素だけを集めた新しいリストを返すgrep、要素を新しい値のリストに変換するmap、要素を並べ替えた新しいリストを返すsortです。
配列を操作する関数には、末尾に要素を追加するpush、最後の要素を削除するpop、最初の要素を削除するshift、先頭に要素を追加するunshift、より複雑な変更を行うspliceがあります。
配列やリストをfor(each)文で繰り返し処理することも、よくあることです。
配列の要素にアクセスするとき、使うシジルによって結果が変わります。変数名の末尾にある添字[]が、その名前の配列にアクセスしていることをPerlに伝えます。
my @names = ('Alice', 'Bob', 'Charlie');
$names[0]; # 'Alice' <- A scalar
@names[0]; # ('Alice') <- A slice (with only one index, this probably isn't what you want. There will be a warning.)
%names[0]; # (0, 'Alice') <- A key/index + value slice
$names[1, 2]; # 'Charlie' <- A scalar (via unsupported syntax for an ancient feature. Probably not what you want. There will be a warning.)
@names[1, 2]; # ('Bob', 'Charlie') <- A slice
%names[1, 2]; # (1, 'Bob', 2, 'Charlie') <- A key/index + value slice
これは許されていますが、読みやすさのために、異なる型の変数に同じ名前を付けないことをおすすめします。
配列とリストには多くの共通点があり、多くの場面で互換的に使えますが、同じものではありません。リストは、固定された不変のスカラーのコレクションです。配列は、内容と配列自体のサイズを変更できる、可変のスカラーのコレクションです。
文脈によっては、両者の振る舞いが異なります。配列をスカラーコンテキストで使うと、配列のサイズが得られます。リストをスカラーコンテキストで使うと、リストの最後の要素が得られます。また、残りの内容が無効コンテキストで使われているという警告が出ることもあります。
my @names = ('Alice', 'Bob', 'Charlie');
scalar @names; # 3
scalar ('Alice', 'Bob', 'Charlie'); # 'Charlie' (and some warnings).
詳しくは、次のFAQをご覧ください: リストと配列の違いは何ですか?