perl字符串分割函数---split的特殊用法

发布时间:2021-01-23编辑:脚本学堂
split作为perl中非常强大的字符串分割工具,有一些特殊的用途,有时可以帮助你解决一些问题及节省脚本对内存等资源的使用。

split作为perl中非常强大的字符串分割工具,有一些特殊的用途,有时可以帮助你解决一些问题及节省脚本对内存等资源的使用。

一般用法: @somearray = split(/:+/, $string ); #括号可以不要。  若不指定$string, 则对默认变量$_操作, 两斜线间为分割符,可以用正则表达式,强悍异常。

在perl手册里,有一个用法不多见。即: split /PATTERN/, EXPR, LIMIT;  关键就是这个LIMIT参数,可以节省不少事情。 如果使用了LIMIT,且是正数,表示分割成不多于LIMIT指定的数目的域。If LIMIT is unspecified or zero, trailing null fields are stripped (which potential users of pop would do well to remember). If LIMIT is negative, it is treated as if an arbitrarily large LIMIT had been specified. Note that splitting an EXPR that evaluates to the empty string always returns the empty list, regardless of the LIMIT specified.

通过制定LIMIT,可以在很长(分割产生几万个元素or域)的行分割操作中,只返回关键的前几列的域值,减少了内存使用及时间消耗。比如一般的基因型数据,第一列通常是材料命名,需要通过材料名的判断取舍,这时候就可以这样用。 my ($firstfield) = split /t/, $someline, 1;  如果需要前面几列的值,这样的方式对大文件效率很好: my (undef, $var1, undef, undef, undef, $var2)=split /t/, $someline, 6;

有网友对这种方式做了测试,显示较好。引用如下:
>>>
一个文件,每行都有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就只能用中间数组。

自己动手测试下吧。