2016-04-25 59 views
-1

我这样做:捕获在分裂

my @words =split(/[~,;#&=\.\s\|\(\)\+\-\?\:]+/,$string); 
my @processed_words =(); 
foreach (@words) {push(@processed_words,process_word($_));} 

可能有人提出一个简单的方法处理后撰写$string回,同时保持未加工的零件是否完整? 还是split不是要走这里的路吗?

+1

你的意思是你想重新组合'@ processed_words'与原始分隔符? – ThisSuitIsBlackNot

回答

1

如果您将分隔符放入捕获组的正则表达式中,那么split将在其结果中包含分隔符 - 它将在单词和分隔符之间交替。然后可以将未处理的分隔符和处理后的单词推送到结果数组中。

my @words =split(/([~,;#&=\.\s\|\(\)\+\-\?\:]+)/,$string); 
my @processed_words =(); 
foreach (@words) { 
    if (/[~,;#&=\.\s\|\(\)\+\-\?\:]/) { // delimiter, just copy it 
     push(@processed_words, $_) 
    } else { // process the word 
     push(@processed_words,process_word($_)); 
} 
0

不太清楚你所说的“撰写$字符串分割后回来”,是什么意思,但也许是这样的:

my $composed = join(" ", map { process_word($_) } @words); 

...会做的伎俩?

+0

在这种情况下,这是一个骗局:http://stackoverflow.com/questions/14907772/split-but-keep-delimiter –

1

您需要在分隔符周围使用捕获组,以将分隔符保留在结果数组中。然后使用for循环,并检查索引是奇数还是偶数,例如(其将在非字字符和使字字符大写)

echo 'a"[email protected]%d.e^f$g' | perl -ne '@a=split(/(\W+)/);for($i=0;$i<@a;++$i){ print $i%2 ? @a[$i] : [email protected][$i];}' 

(凡$i%2检查索引$i是奇数甚至)。