2017-10-05 40 views
0

我想知道段落中有多少單詞,然後找到每個單詞出現次數。 我可以做到這一點,但是有沒有其他方法可以只使用正則表達式?捕獲一行中的所有單詞並使用Perl正則表達式計算它們的出現

my $string = "John is a good boy. John goes to school with his brother Johnny. When John is hungry, he eats his tiffin."; 
my @list =(); 
while($string =~ /(\b\w+\b)/gi) 
{ 
     push(@list, $1); 
} 

my %counts; 
for (@list) { 
    $counts{$_}++; 
} 
print "$#list \n"; 
foreach my $keys (keys %counts) { 
    print "$keys = $counts{$keys}\n"; 
} 

輸出應該是

20 
brother = 1 
a = 1 
goes = 1 
is = 2 
good = 1 
to = 1 
tiffin = 1 
When = 1 
boy = 1 
his = 2 
school = 1 
Johnny = 1 
he = 1 
eats = 1 
John = 3 
with = 1 
hungry = 1 
+0

你已經在使用正則表達式嗎? –

+0

不,我的意思是使用正則表達式來計算出現次數。我正在使用list和hash。 –

+0

你想要一個甚至不使用散列的解決方案嗎? –

回答

2

我看不到的方式來做到這一點純粹用正則表達式,如果這種方式確實存在,這將是一個真正的過於複雜的正則表達式,這將是很難維護。但是,通過使用散列和丟失列表可以簡化你所擁有的內容;

use strict; 
use warnings; 

my $string = "John is a good boy. John goes to school with his brother Johnny. When John is hungry, he eats his tiffin."; 
my %counts; 
my $word_count = 0; 
while($string =~ /\b(\w+)\b/g) 
    { 
    $counts{$1}++; 
    $word_count++; 
    } 

print "$word_count\n"; 
foreach my $keys (keys %counts) 
    { 
    print "$keys = $counts{$keys}\n"; 
    } 

注:我已經調整了正則表達式略有你並不需要的「\ b」的拍攝組內,使其不區分大小寫如您不匹配特定字符串是不是必需的。並添加了「嚴格使用」;和「使用警告」;你應該總是在你的perl的頂部拋出任何問題。

相關問題