2016-04-25 40 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是奇數甚至)。