现在的位置: 首页 > 综合 > 正文

perl split函数

2014年01月19日 ⁄ 综合 ⁄ 共 3929字 ⁄ 字号 评论关闭

perl split函数  


 Perl中的一个非常有用的函数是split
- 把字符串进行分割并把分割后的结果放入数组中。这个函数使用规则表达式(RE),如果未特定则工作在$_变量上

split函数可以这样使用:


$info = "Caine:Michael:Actor:14, Leafy Drive";

@personal = split(/:/, $info);


其结果是: 

@personal = ("Caine", "Michael", "Actor", "14, Leafy Drive");


如果我们已经把信息存放在$_变量中,那么可以这样:


@personal = split(/:/);


如果各个域被任何数量的冒号分隔,可以用RE代码进行分割:


$_ = "Capes:Geoff::Shot putter:::Big Avenue";

@personal = split(/:+/);


其结果是


@personal = ("Capes", "Geoff", "Shot putter", "Big Avenue"); 


但是下面的代码:


$_ = "Capes:Geoff::Shot putter:::Big Avenue";

@personal = split(/:/);


的结果是


@personal = ("Capes", "Geoff", "", "Shot putter", "", "", "Big Avenue"); 

单词可以被分割成字符,句子可以被分割成单词,段落可以被分割成句子:


@chars = split(//, $word);

@words = split(/ /, $sentence);

@sentences = split(/\./, $paragraph);


在第一句中,空字符串在每个字符间匹配,所以@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项,话说这天正好求知欲比较强,就折腾了几种用法

1:my @array = split("\t",$_); my $var = $array[6];   测试文件平均用时8.2s

2. my($var) = (split("\t",$_))[6];  测试平均用时5.1s

3. my(undef,undef,undef,undef,undef,undef,$var) = split("\t",$_); 平均用时3.53s

4. my(undef,undef,undef,undef,undef,undef,$var) = split("\t",$_,7);平均用时3.52s

5. my $var = (split("\t",$_,7))[6]; 平均用时3.53s

看来后3种才是王道,如果需要使用多项也可以进行进行适当的变动。不过两项如果跨度比较大,3,4应该是不错选择,5就只能用中间数组。

ps:洗洗屁屁是c/c++的意思。

http://wbo65.blog.163.com/blog/static/9562292020095425438810/






spl

it函数可以这样使用:


$info = "Caine:Michael:Actor:14, Leafy Drive";

@personal = split(/:/, $info);


其结果是: 

@personal = ("Caine", "Michael", "Actor", "14, Leafy Drive");


如果我们已经把信息存放在$_变量中,那么可以这样:


@personal = split(/:/);


如果各个域被任何数量的冒号分隔,可以用RE代码进行分割:


$_ = "Capes:Geoff::Shot putter:::Big Avenue";

@personal = split(/:+/);


其结果是


@personal = ("Capes", "Geoff", "Shot putter", "Big Avenue"); 


但是下面的代码:


$_ = "Capes:Geoff::Shot putter:::Big Avenue";

@personal = split(/:/);


的结果是


@personal = ("Capes", "Geoff", "", "Shot putter", "", "", "Big Avenue"); 

单词可以被分割成字符,句子可以被分割成单词,段落可以被分割成句子:


@chars = split(//, $word);

@words = split(/ /, $sentence);

@sentences = split(/\./, $paragraph);


在第一句中,空字符串在每个字符间匹配,所以@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项,话说这天正好求知欲比较强,就折腾了几种用法

1:my @array = split("\t",$_); my $var = $array[6];   测试文件平均用时8.2s

2. my($var) = (split("\t",$_))[6];  测试平均用时5.1s

3. my(undef,undef,undef,undef,undef,undef,$var) = split("\t",$_); 平均用时3.53s

4. my(undef,undef,undef,undef,undef,undef,$var) = split("\t",$_,7);平均用时3.52s

5. my $var = (split("\t",$_,7))[6]; 平均用时3.53s

看来后3种才是王道,如果需要使用多项也可以进行进行适当的变动。不过两项如果跨度比较大,3,4应该是不错选择,5就只能用中间数组。

ps:洗洗屁屁是c/c++的意思。

http://wbo65.blog.163.com/blog/static/9562292020095425438810/

抱歉!评论已关闭.