我这样做:
my @words =split(/[~,;#&=\.\s\|\(\)\+\-\?\:]+/,$string);
my @processed_words = ();
foreach (@words) {push(@processed_words,process_word($_));}
有人可以提出一种简单的方法来处理$string
后处理,同时保持未处理的部分完整吗?
或split
不是去这里的方式?
答案 0 :(得分:1)
您需要在分隔符周围使用捕获组,以将分隔符保留在结果数组中。然后使用for循环并检查索引是奇数还是偶数,例如(拆分非单词字符并使单词字符大写):
echo 'a"b@c%d.e^f$g' | perl -ne '@a=split(/(\W+)/);for($i=0;$i<@a;++$i){ print $i%2 ? @a[$i] : uc@a[$i];}'
($i%2
检查索引$i
是奇数还是偶数)。
答案 1 :(得分: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($_));
}
答案 2 :(得分:0)
不太确定你的意思是“在拆分后将字符串写回”,但可能是这样的:
my $composed = join(" ", map { process_word($_) } @words);
......可以解决这个问题吗?