语法
split /PATTERN/, EXPR, LIMIT
split /PATTERN/, EXPR
split /PATTERN/
split
功能
将字符串 EXPR 拆分成字符串列表,列表中的每个元素被称为拆分得到的fields,在列表上下文返回拆分得到的列表,在标量上下文返回拆分得到列表的长度。
注意:在5.11以前,如果在列表上下文或是没有接收返回值变量的情况下它会用拆分得到的列表覆盖@_变量,所以如果你的Perl版本低于5.11时就需要多留心了。
- 如果调用split时只传了一个参数PATTERN,则EXPR默认为$_。
- 与PATTERN相匹配的EXPR中的任何内容都将会被视为分隔符,它他不会出现在拆分结果中。(注意:分隔符可能不止一个字符,也有可能没有任何字符,当PATTERN为空字符串时可以进行零宽度匹配)
- 模式不需要是常量,可以使用表达式来指定在运行期间产生的变化的模式。
- 如果PATTERN匹配空字符串,EXPR将在匹配位置(字符之间)分割。
- 如果LIMIT为负数,则被视为无穷大,split会尽可能分隔出更多的fields,并返回所有的fields。
- 如果省略了LIMIT或LIMIT为0,split会尽可能分隔得到更多的fields,然后把所有尾部为空的fields删除掉,把得到的结果返回。不管尾部有多少空fields都会被删除掉。
- split会尽量避免拆分出过多的fields,当把split的返回值直接赋给一个列表且LIMIT被省略或为0时,则LIMIT被视为比接收返回值的列表长度大一的数字。如下面(例5)中的代码,LIMIT将被视为3。
- 如果EXPR为空字符串,无论PATTERN是什么,无论LIMIT的值是多少,都将得到一个空列表。
- 如果EXPR的开始处有与PATTERN(PATTERN是非空模式)匹配的字符串,则会产生前导的空fields。
- 如果PATTERN中包含“捕获组”,则对于每一次分隔都将为所有“捕获组”分别产生一个附加的fields(按“捕获组”的顺序);如果有任何没有被匹配的捕获组,则它捕获undef值而不是空字符串。需要注意的是,每次分隔都会产生一批(有多少个“捕获组”就产生多少个)附加fields,并且这些附加fields是不计数的。请看例6
例子
## 例1
## a:c
print join(":",split(/b/,'abc')),"\n";
## 例2
## a:b:c
print join(":",split(//,'abc')),"\n";
## 例3
## a:b:c
print join(":",split(/,/,'a,b,c,,,,'),"\n";
## 例4
## a:b:c::::
print join(":",split(/,/,'a,b,c,,,,',-1),"\n";
## 例5
my ($username,$password) = split(/:/);
## 例6
## ('1','10','20')
split(/-|,/,"1-10,20",3);
## ('1','-','10',',','20')
split(/(-|,)/,"1-10,20",3);
## ('1','-','10',undef,'20')
split(/(-)|,/,"1-10,20",3);
## ('1','-',undef,'10',undef,',','20')
split(/(-)|(,)/,"1-10,20",3);