2012-11-22 32 views
1

我有一個.txt文件,其中包含許多電子郵件,包括標題。我只是想知道如何使用perl來查明在這個文本文件中找到了多少次相同的電子郵件地址? 它會涉及正則表達式嗎?計算文本文件中電子郵件地址的出現次數

+0

這取決於您的文本文件的結構。一些更多的細節會很好。 – flesk

回答

2

這個怎麼樣腳本:

#!/usr/bin/perl 

use strict; 
use Data::Dumper; 

my @email_list =(); 
my %count; 

while (my $line = <>) { 
    foreach my $email (split /\s+/, $line) { 
     if ($email =~ /^[-\w.][email protected]([a-z0-9][a-z-0-9]+\.)+[a-z]{2,4}$/i) { 

      push(@email_list,$email); 
     } 
    } 
} 

print "Total Email Count: ".scalar(@email_list)."\n\n"; 
$count{$_}++ for @email_list; 
print Dumper(\%count); 

保存它作爲email.pl這樣的文件,並確保它可執行chmod +x email.pl

./email.pl file.txt

它將打印發現電子郵件地址的總數量和每個電子郵件地址數。

+1

只要有人知道(並且不介意),根據規範遠未匹配所有有效的電子郵件地址,這可能是一個很好的快速和骯髒的解決方案。 – dan1111

+0

@ dan1111'OP'規範很含糊,提到'regex',同意最好使用'Email :: Valid'或其他東西,但是這樣做的工作和*相對*簡單易懂:) –

+0

謝謝你,如果我已經在我的perl文件中有另外一個函數,而且還需要file.txt參數,我該如何執行這個操作? – Dave

5

您可能會感興趣cpan: Email::Find。您可以將您在電子郵件中查找到的地址存儲在密鑰和計數器中作爲值。你應該可以用回調來做到這一點。你能開始使用嗎?

+2

另一個地址解析模塊 - [Regexp :: Common :: Email :: Address](http://search.cpan.org/~cwest/Regexp-Common-Email-Address-1.01/lib/Regexp/Common/Email/ Address.pm)。 –

+0

@ChrisCharley奇妙的,甚至比我發現的更好! –

1

如果你想找到所有的電子郵件地址,我建議嘗試一個模塊,而不是寫自己的正則表達式。正確匹配所有電子郵件地址變得相當複雜。

#!usr/bin/perl 
use strict; 
use warnings; 

my $count = 0; 
my $email = '[email protected]'; 

while(<DATA>) 
{ 
    $count++ while (m/(^|\s)\K\Q$email\E(?=\s|$)/g); 
} 

print "Found $email $count times"; 

__DATA__ 
[email protected] [email protected] 

[email protected] #not a match 

[email protected] #not a match 
blah blah blah [email protected] blah blah 
[email protected] #not a match 

注意,這需要電子郵件地址通過從任何其他內容分離:

但是,如果你只是想尋找一個給定的電子郵件地址,你可以用一個非常簡單的正則表達式實現這一目標空白。

一些注意事項: \Q...\E是引用文字轉義。它確保電子郵件地址中的任何內容都不會被視爲特殊的正則表達式字符(如果沒有這種情況,.將匹配任何字符而不是字面句點)。

(?=...)是一個預讀插入。這將匹配內容而不包含在實際匹配中。這很重要,因爲單個空間可能是之前發生的一次郵件和之後另一次。爲了匹配兩者,你不希望第一場比賽「吃掉」那個空間。

相關問題