將字串 EXPR 分割成字串清單,並在清單內容中傳回清單,或在標量內容中傳回清單大小。(在 Perl 5.11 之前,它也會在空值和標量內容中以清單覆寫 @_
。如果您鎖定舊的 Perl,請小心。)
如果只提供 PATTERN,EXPR 預設為 $_
。
EXPR 中任何符合 PATTERN 的內容都被視為分隔符號,將 EXPR 分割成子字串(稱為「欄位」),其中不包含分隔符號。請注意,分隔符號的長度可能超過一個字元,甚至可能沒有任何字元(空字串,為零寬度比對)。
PATTERN 不需要是常數;可以使用表達式來指定在執行時變化的模式。
如果 PATTERN 符合空字串,EXPR 會在比對位置(字元之間)分割。例如,以下
my @x = split(/b/, "abc"); # ("a", "c")
使用 'abc'
中的 b
作為分隔符號,產生清單(「a」、「c」)。然而,這個
my @x = split(//, "abc"); # ("a", "b", "c")
使用空字串比對作為分隔符號;因此,空字串可用於將 EXPR 分割成其組成字元的清單。
對於 split
的特殊情況,在 比對運算子 語法 (//
) 中提供的空樣式特別比對空字串,這與其通常解釋為最後一次成功比對相反。
如果 PATTERN 是 /^/
,則會視為使用 多行修改器 (/^/m
),因為否則它沒有太多用途。
可以明確指定 /m
和任何其他對 qr
有效的樣式修改器(在 "qr/STRING/msixpodualn" in perlop 中總結)。
作為另一個特殊情況,split
模仿命令列工具 awk 的預設行為,當 PATTERN 被省略或為由單一空白字元組成的字串(例如 ' '
或 "\x20"
,但不是例如 / /
)時。在此情況下,會在分割發生前移除 EXPR 中的任何前導空白,而 PATTERN 則會被視為 /\s+/
;特別是,這表示任何連續空白(不只是單一空白字元)都會被用作分隔符號。
my @x = split(" ", " Quick brown fox\n");
# ("Quick", "brown", "fox")
my @x = split(" ", "RED\tGREEN\tBLUE");
# ("RED", "GREEN", "BLUE")
以這種方式使用 split 與 qw//
的運作方式非常類似。
不過,可以透過指定樣式 / /
而不是字串 " "
來避免這種特殊處理,從而只允許單一空白字元成為分隔符號。在較早的 Perl 中,這個特殊情況僅限於將純粹的 " "
用作 split 的樣式引數;在 Perl 5.18.0 及更新版本中,這個特殊情況會由任何評估為單純字串 " "
的運算式觸發。
從 Perl 5.28 開始,這個特殊情況的空白分割在 "use feature 'unicode_strings'"
的範圍內按預期運作。在之前的版本中,以及在該功能的範圍之外,它會出現 "The "Unicode Bug"" in perlunicode:根據 Unicode 規則但不是根據 ASCII 規則為空白的字元可能會被視為欄位的一部分,而不是欄位分隔符號,具體取決於字串的內部編碼。
如果省略,PATTERN 預設為單一空白," "
,觸發先前描述的awk 模仿。
如果指定 LIMIT 且為正數,它表示 EXPR 可以被分割的最大欄位數;換句話說,LIMIT 比 EXPR 可以被分割的最大次數多一。因此,LIMIT 值 1
表示 EXPR 最多可以被分割零次,產生最多一個欄位(即 EXPR 的整個值)。例如
my @x = split(//, "abc", 1); # ("abc")
my @x = split(//, "abc", 2); # ("a", "bc")
my @x = split(//, "abc", 3); # ("a", "b", "c")
my @x = split(//, "abc", 4); # ("a", "b", "c")
如果 LIMIT 為負數,則會將其視為任意大的數字;會產生盡可能多的欄位。
如果省略 LIMIT(或等於零),則通常會將其視為負數,但例外情況是會移除尾端的空白欄位(開頭的空白欄位永遠會保留);如果所有欄位都為空白,則所有欄位都會被視為尾端欄位(並在這種情況下移除)。因此,下列
my @x = split(/,/, "a,b,c,,,"); # ("a", "b", "c")
只會產生一個包含三個元素的清單。
my @x = split(/,/, "a,b,c,,,", -1); # ("a", "b", "c", "", "", "")
會產生一個包含六個元素的清單。
在時間關鍵的應用程式中,避免將資料分割成比必要更多的欄位是有價值的。因此,在指定到清單時,如果省略 LIMIT(或為零),則會將 LIMIT 視為比清單中的變數數量多一個;對於下列範例,LIMIT 隱含為 3
my ($login, $passwd) = split(/:/);
請注意,將評估為空白字串的 EXPR 分割永遠會產生零個欄位,不論指定的 LIMIT 為何。
當在 EXPR 的開頭有正寬度比對時,會產生一個開頭的空白欄位。例如
my @x = split(/ /, " abc"); # ("", "abc")
會分割成兩個元素。然而,在 EXPR 開頭的零寬度比對永遠不會產生空白欄位,因此
my @x = split(//, " abc"); # (" ", "a", "b", "c")
會分割成四個元素,而不是五個。
另一方面,當在 EXPR 的結尾有比對時,會產生一個尾端的空白欄位,不論比對的長度(當然,除非明確給定非零的 LIMIT,否則會移除這些欄位,如同最後一個範例)。因此
my @x = split(//, " abc", -1); # (" ", "a", "b", "c", "")
如果 PATTERN 包含 擷取群組,則對於每個分隔符號,會為每個由群組擷取的子字串產生一個額外的欄位(按照群組指定的順序,如同 反向參照);如果任何群組沒有比對,則會擷取 undef
值,而不是子字串。此外,請注意,只要有分隔符號(也就是每當發生分割時),就會產生任何此類額外的欄位,而且此類額外的欄位不會計入 LIMIT。考慮在清單內容中評估下列表達式(每個傳回的清單都提供在相關註解中)
my @x = split(/-|,/ , "1-10,20", 3);
# ("1", "10", "20")
my @x = split(/(-|,)/ , "1-10,20", 3);
# ("1", "-", "10", ",", "20")
my @x = split(/-|(,)/ , "1-10,20", 3);
# ("1", undef, "10", ",", "20")
my @x = split(/(-)|,/ , "1-10,20", 3);
# ("1", "-", "10", undef, "20")
my @x = split(/(-)|(,)/, "1-10,20", 3);
# ("1", "-", undef, "10", undef, ",", "20")