Perl中的一个非常有用的函数是split - 把字符串进行分割并把分割后的结果放入数组中。这个函数使用规则表达式(RE),如果未特定则工作在$_变量上。
split函数可以这样使用:
其结果是:
@personal = ("Caine", "Michael", "Actor", "14, Leafy Drive");
如果我们已经把信息存放在$_变量中,那么可以这样:
@personal = split(/:/);
如果各个域被任何数量的冒号分隔,可以用RE代码进行分割:
其结果是
@personal = ("Capes", "Geoff", "Shot putter", "Big Avenue");
但是下面的代码:
的结果是
@personal = ("Capes", "Geoff", "", "Shot putter", "", "", "Big Avenue");
单词可以被分割成字符,句子可以被分割成单词,段落可以被分割成句子:
在第一句中,空字符串在每个字符间匹配,所以@chars数组是一个字符的数组。>>
才学习perl,前几天偶然发现split的几种用法,就测试了一下各种用法的效率。大神却说:P大个事,还以为抢鸡蛋呢?perl还讲个毛的效率,怎么搞都是慢,用洗洗屁屁搞。
先引用一段split的手册
split /PATTERN/, EXPR, LIMIT
split /PATTERN/, EXPR
split /PATTERN/
split
这个函数扫描字串中 EXPR 给出的分隔符,并且把该字串劈成一个子字串列表,在列表环境中返回生成的列表值,或者在标量环境中返回子字串的数量。(注:标量环境同时还令 split 把它的结果写到 @_,不过这个用法现在废弃了。
)分隔符是用重复的模式匹配进行判断的,用的是 PATTERN 里给出的正则表达式,因此分隔符可以是任意大小,并且不一定在每次匹配都是一样的字串。(分隔符不象平常那样返回;我们在本节稍后讨论例外情况。)如果 PATTERN 完全不能匹配该字串,那么 split 把原始字串当作子字串返回。如果它匹配了一次,那么你就得到两个子字串,以此类推。你可以在 PATTERN 里使用正则表达式修饰词,比如 /PATTERN/i,/PATTERN/x,等等。如果你以模式 /^/ 进行分裂,那么就假设是 //m 修饰词。
如果声明了 LIMIT 并且是正的,该函数分裂成不超过那么多的域(当然如果它用光了分隔符,那么是可以分裂成比较少的子字串的)。如果 LIMIT 是负数,那就把它当作声明了任意大的 LIMIT。如果省略了 LIMIT 或者是零,那么将从结果中删除结尾的空域(那些潜在的 pop 用户应该好好记住)。如果省略了 EXPR,那么该函数就分裂 $_ 字串。如果还省略了 PATTERN 或者它是一个文本空格,“ ”,那么该函数对空格进行操作,/s+/,但是忽任何开头的空格。
这天看见一个文件,每行都有18项,各项之间用t分割,使用时用到了第6项,话说这天正好求知欲比较强,就折腾了几种用法
看来后3种才是王道,如果需要使用多项也可以进行进行适当的变动。不过两项如果跨度比较大,3,4应该是不错选择,5就只能用中间数组。
备注:洗洗屁屁是c/c++的意思。