陣列與列表包含一串有序的純量。 除非使用參考(這會在另一個概念中介紹),否則這表示陣列和列表一律是扁平的,也就是說,它們不能包含其他陣列或列表。
大多數情況下,列表會用括號 () 包住,其中的元素以逗號 , 分隔。
陣列變數通常是透過把列表指定給它來填入內容,例如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).
更多說明請見以下常見問題:列表和陣列有什麼差別?