您好,欢迎访问一九零五行业门户网

Split操作符_PHP教程

split它会根据给定的模式拆分字符串,对于使用制表符、冒号、空白符或任意符号分隔不同字段的字符串来说,用这个操作符分解提取字段相当方便。只要你能将分隔符写成模式(通常是很简单的正则表达式),就可以用split分解数据。它的用法如下:
    my @fields = split /separator/, $string;
    这里的split操作符用拆分模式扫描指定的字符串并返回字段(也就是子字符串)列表。期间只要模式在某处匹配成功,该处就是当前字段的结尾、下一字段的开头。所以,任何匹配模式的内容都不会出现在返回字段中。下面就是典型的以冒号作为分隔符的split模式:
   my @fields = split /:/, “abc:def:g:h”;        #得到(“abc”,“def”,“g”,“h”)
    如果两个分隔符连在一起,就会产生空字段:
   my @fields = split /:/, “abc:def::g:h”;     #得到(“abc”,“def”,“”,“g”,“h”)
   这里有个规则,它乍看之下很古怪,但很少造成问题:split会保留开头处的空字段,却舍去结尾处的空字段。例如:
   my @fields = split /:/, “:::a:b:c:::”;        #得到(“”,“”,“”,“a”,“b”,“c”)
    利用split的/\s+/模式根据空白符分隔字符也是比较常见的做法。该模式把所有连续空白都视作单个空格并以此切分数据:
    my $some_input = “this  is a \t     test.\n”;
     my @args = split /\s+/, $some_input;     #得到(“this”,“is”,“a”,“test.”)
    默认split会以空白符分隔$_中的字符串:
    my @fields = split;                       #等效于split /\s+/,$_;
    这几乎就等于以/\s+/为模式,只是它会省略开头的空字段。所以,即使该行以空白开头,你也不会在返回列表的开头处看到空字段。若你想以这种方式来分解用空格分隔的字符串,则可以用一个空格来作为模式:split ‘’, $other_string用一个空格来作为模式是split的特殊用法。
    一般来说,用在split中的模式就像之前看到的这样简单。但如果你用到更复杂的模式,请避免在模式里使用捕获圆括号,因为这会启动所谓的“分隔符保留模式(详情请参见perlfunc文档)。如果需要在模式中使用分组匹配,请在split里使用非捕获圆括号(?:)的写法,以避免意外。
    进一步加深对split分解提取字段带来的方便。下面给出一段我实际工作中未使用split操作符分解提取字段的代码(后面还将给出使用split操作符的代码)对比从中感受一下它的强大:
    任务:从passwd文件中提取用户名、用户主目录信息;
    我们先看一下passwd文件中记录格式(图1-1 部份摘录):
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/sh
……
    可以看出每个字段都用冒号(:)进行分隔,以第一条记录从左向右为例我们要提取第一个冒号前面的root(用户名)和第六个冒号前面的/root(用户主目录)。
[php]  
#代码1.1 未使用split操作符提取字段代码;  
#!/usr/bin/perl -w  
use strict;  
open (fh, '/etc/passwd') or die can't open file: $!;  
while (){  
    my ($pos,$endpos,$length,$name,$dir);  
    #############  
    # 取用户名称  
    #############  
    $length =  index ($_, :);  
    $name = substr ($_, 0, $length);  
    #####################  
    # 取用户home目录位置  
    #####################  
    $endpos = rindex ($_, :);  
    # $endpos-1跳过当前位置(冒号)  
    $pos = rindex ($_, :, $endpos - 1);         
    # $pos+1跳过当前位置(冒号)   
    # 查找方向从左向右。所以+1  
    $pos += 1;  
    $length = $endpos - $pos;  
    $dir = substr ($_, $pos, $length);
print $name\t$dir\n;  
}  
close (fh);  
    程序运行后输出如下(图1-2):
root       /root
bin        /bin
……
    现在我们来分析一下这段代码的算法,提取用户名很简单只需要找到第一个冒号位置通过substr($_,0,$length)函数返回的子字符串即是需要的用户名。算法比较复杂的部份是提取用户主目录,通过图1-1可见passwd文件本身是有着固定格式的,记录从后向前(从右向左)倒数第二个冒号后面的/root就是用户主目录信息。
    提取用户主目录算法思想:
    1、  略过记录最后一个字段;
    2、  找到倒数第二个字段起始位置;
    3、  倒数第一个字段的起始(冒号)位置减去倒数第二个字段字符的开始位置(/号),得出来的结果就是用户主目录字段中的字符长度;
   4、  substr($_,$pos,$length);返回用户主目录信息;
    5、完成。
(图 1-3 提取用户目录算法)
    总结,通过perl字符串处理函定位、提取字段信息可以完成我们的任务,可预见当我们要提取多个不相连字段,步骤将更繁琐,代码更长,也更加容易出错,如果,记录各字段位置发生改变,你将不得不重新设计你的算法。
    现在,我们再看使用split操作符分解提取字段的例子:
[php]  
#代码1.2 使用split操作符提取字段代码;  
#!/usr/bin/perl -w  
use strict;  
open (fh, '/etc/passwd') or die can't open file: $!;  
while (){  
  ###########  
  # 取用户信息  
  ###########     
  my($name,$dir) = (split /:/,$_)[0,5];
print $name\t$dir\n;  
}  
close (fh);

http://www.bkjia.com/phpjc/477706.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/477706.htmltecharticlesplit它会根据给定的模式拆分字符串,对于使用制表符、冒号、空白符或任意符号分隔不同字段的字符串来说,用这个操作符分解提取字段...
其它类似信息

推荐信息