共计 2030 个字符,预计需要花费 6 分钟才能阅读完成。
导读 | 本文向大家简单介绍一下 Perl split 函数的用法,Perl 中的一个非常有用的函数是 Perl split 函数 - 把字符串进行分割并把分割后的结果放入数组中。 |
本文和大家重点讨论一下 Perl split 函数的用法,Perl 中的一个非常有用的函数是 Perl split 函数 - 把字符串进行分割并把分割后的结果放入数组中。这个 Perl split 函数使用规则表达式(RE),如果未特定则工作在 $_变量上。
Perl 中的一个非常有用的函数是 Perl split 函数 - 把字符串进行分割并把分割后的结果放入数组中。这个 Perl split 函数使用规则表达式(RE),如果未特定则工作在 $_变量上。
Perl split 函数可以这样使用:
$info="Caine:Michael:Actor:14,LeafyDrive";
@personal=split(/:/,$info);
其结果是:@personal=("Caine","Michael","Actor","14,LeafyDrive");
◆如果我们已经把信息存放在 $_变量中,那么可以这样:
@personal=split(/:/);
如果各个域被任何数量的冒号分隔,可以用 RE 代码进行分割:
$_="Capes:Geoff::Shotputter:::BigAvenue";
@personal=split(/:+/);
其结果是:@personal=(“Capes”,”Geoff”,”Shotputter”,”BigAvenue”);
但是下面的代码:
$_="Capes:Geoff::Shotputter:::BigAvenue"; @personal=split(/:/);
的结果是:@personal=("Capes","Geoff","","Shotputter","","","BigAvenue");
这个 Perl split 函数中单词可以被分割成字符,句子可以被分割成单词,段落可以被分割成句子:
@chars=split(//,$word);
@words=split(//,$sentence);
@sentences=split(/\./,$paragraph);
在第一句中,空字符串在每个字符间匹配,所以 @chars 数组是一个字符的数组。>>
// 之间的部分表示 split 用到的正则表达式(或者说分隔法则)
\s 是一种通配符,代表空格
+ 代表重复一次或者一次以上。
所以,\s+ 代表一个或者一个以上的空格。
split(/\s+/,$line)表示把字符串 $line, 按空格为界分开。
比如说,$line=” 你好朋友欢迎光临我的网站 jb51.net”;
split(/\s+/,$line)后得到:
你好朋友欢迎访问我的网站 jb51.net
一般用法:@somearray = split(/:+/, $string); #括号可以不要。若不指定 $string, 则对默认变量 $_操作,两斜线间为分割符,可以用正则表达式,强悍异常。
在 perl 手册里,有一个用法不多见。即:split /PATTERN/, EXPR, LIMIT;关键就是这个 LIMIT 参数,可以节省不少事情。如果使用了 LIMIT,且是正数,表示分割成不多于 LIMIT 指定的数目的域。
通过制定 LIMIT,可以在很长 (分割产生几万个元素 or 域) 的行分割操作中,只返回关键的前几列的域值,减少了内存使用及时间消耗。比如一般的基因型数据,第一列通常是材料命名,需要通过材料名的判断取舍,这时候就可以这样用。my ($firstfield) = split /\t/, $someline, 1; 如果需要前面几列的值,这样的方式对大文件效率很好:my(undef, $var1, undef, undef, undef, $var2)=split /\t/, $someline, 6;
有网友对这种方式做了测试,显示较好。引用如下:
一个文件,每行都有 18 项,各项之间用 \t 分割,使用时用到了第 6 项,折腾了几种用法
复制代码代码如下:
my @array = split("\t",$_); my $var = $array[6]; 测试文件平均用时 8.2s
my($var) = (split("\t",$_))[6]; 测试平均用时 5.1s
my(undef,undef,undef,undef,undef,undef,$var) = split("\t",$_); 平均用时 3.53s
my(undef,undef,undef,undef,undef,undef,$var) = split("\t",$_,7); 平均用时 3.52s
my $var = (split("\t",$_,7))[6]; 平均用时 3.53s
看来后 3 种才是王道,如果需要使用多项也可以进行进行适当的变动。不过两项如果跨度比较大,3,4 应该是不错选择,5 就只能用中间数组。