我这样做:捕获在分裂
my @words =split(/[~,;#&=\.\s\|\(\)\+\-\?\:]+/,$string);
my @processed_words =();
foreach (@words) {push(@processed_words,process_word($_));}
可能有人提出一个简单的方法处理后撰写$string
回,同时保持未加工的零件是否完整? 还是split
不是要走这里的路吗?
我这样做:捕获在分裂
my @words =split(/[~,;#&=\.\s\|\(\)\+\-\?\:]+/,$string);
my @processed_words =();
foreach (@words) {push(@processed_words,process_word($_));}
可能有人提出一个简单的方法处理后撰写$string
回,同时保持未加工的零件是否完整? 还是split
不是要走这里的路吗?
如果您将分隔符放入捕获组的正则表达式中,那么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($_));
}
不太清楚你所说的“撰写$字符串分割后回来”,是什么意思,但也许是这样的:
my $composed = join(" ", map { process_word($_) } @words);
...会做的伎俩?
在这种情况下,这是一个骗局:http://stackoverflow.com/questions/14907772/split-but-keep-delimiter –
您需要在分隔符周围使用捕获组,以将分隔符保留在结果数组中。然后使用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
是奇数甚至)。
你的意思是你想重新组合'@ processed_words'与原始分隔符? – ThisSuitIsBlackNot