|
另一个使用正则表达式的操作是split,它根据某个模式将字符串分割开。这对于由制表符分割开,冒号分割开,空白分割
开,或者任意字符分割开的数据是非常有用的◆。任何可在正则表达式之中(通常,是一个简单的正则表达式)指定分离
符(separator)的地方,均可用split。其形式如下:
◆不包括“comma-separated values(逗号分割开的数据)”,其一般被称作CSV 文件。使用split 对它处理是非常痛苦的;最好利用CPAN
中的Text:CSV 模块
@fields = split /separtor/, $string;
split◆将模式同字符串进行比较,将由分离符所分隔开的子串作为列表返回回来。当模式匹配上,既是此次匹配结束,和
新匹配的开始。因此,任何匹配模式的部分均不会在返回值中出现。下面是一个典型的split 操作,由冒号分开:
◆它是一个操作,虽然其行为很像函数,通常每一个人都认为它是一个函数。但其技术上的区别超出了本书讨论的范围。
@fields = split /:/, “abc:def:g:h”; #返回(“abc”, “def”, “g”, “h”)
可能得到空的元素,如果其中有两个分隔符是连在一起的:
@fields = split /:/,“abc:def::g:h”; #得到(“abc”, “def”, “”, “g”, “h”)
这里有一条规则:开头的空元素会被返回,但结尾的空元素被丢弃◆。虽然第一次见到时看起来有些古怪,但很少引起问
题。
◆这仅是默认的行为,是基于效率方面的考虑。如果担忧丢失了结尾的空元素,可以使用split 的第三个参数: -1。请参阅perlfunc 的帮助
手册。
@fields = split /:/, “:::a:b:c:::”; #得到(“”, “”, “”, “a”, “b”, “c”);
使用空白/\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 操作相同的结果,可在模式的部分使用单个的空格:split ‘’,
$other_string。使用空格而非模式,是另一种特殊类型的split 操作)。
通常,split 所使用的模式同这里出现的一样简单。但如果模式变得复杂时,那应避免在模式中使用括号。请参阅perlfunc
以了解更多的信息◆。
◆你可能需要察看perlre 的帮助手册中关于什么情况下括号只是起到分组作用的信息。 |
|