2012-01-25 38 views
4

我想拆分有一定的重复图案的字符串,例如:到目前为止Perl以最有效的方式在重复模式中分割字符串?

$string = "GGGGG-SOMETHING-ELSE-GGG-LAST"; 

@array=(-SOMETHING-ELSE-,-LAST); 

我尝试作为一个Perl新手

split(/G{2,}/,$string); 

不幸的是,这只会导致GG分裂的模式 - 而不是我期望得到的贪婪的GGGGG或GGG模式导致2个数组元素。

回答

5

不,这似乎(大部分)按预期工作。下面的代码:

use strict; 
use warnings; 

$_="GGGGG-SOMETHING-ELSE-GGG-LAST"; 
my @a=split(/G{2,}/,$_); 
print join(",",@a) . "\n"; 

产生输出:

,-SOMETHING-ELSE-,-LAST 

的问题是,有这空字符串的第一元素。因此,要解决这个问题,你可以这样做:

use strict; 
use warnings; 

$_="GGGGG-SOMETHING-ELSE-GGG-LAST"; 
my @a=grep{$_ ne ""}(split(/G{2,}/,$_)); 
print join(",",@a) . "\n"; 

这会产生你想要什么:

-SOMETHING-ELSE-,-LAST 
+0

我将电脑切换到Ubuntu 11机器,您的单线以及我的技术工作正常。我认为这是我的Perl版本的一个神器。 – oiiio

+3

只需'grep $ _,split/G {2,} /'可以正常工作。由于空字符串为假,因此无需对每个元素进行比较。 – Borodin

0

我只是检查你的代码在我的机器上工作得很好:

$string = "GGGGG-SOMETHING-ELSE-GGG-LAST"; 
print join(':', split(/G{2,}/,$string)); 

回报:

:-SOMETHING-ELSE-:-LAST 

ŧ他使用的perl版本是:v5.10.1

您可以添加一些关于如何运行它的更多信息吗?