1

我有一个 .txt 文件,其中包含许多电子邮件,包括标题。我只是想知道如何使用 perl 来找出在这个文本文件中找到了多少相同的电子邮件地址?它会涉及正则表达式吗?

4

3 回答 3

5

您可能会发现cpan: Email::Find很有用。您可以将找到的地址存储在哈希表中,其中电子邮件作为键,计数器作为值。您应该能够通过回调来做到这一点。你能从这个开始吗?

于 2012-11-22T11:28:11.840 回答
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.]+@([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

它将打印找到的电子邮件地址总数并计算每个电子邮件地址。

于 2012-11-22T11:44:34.160 回答
1

如果您想查找所有电子邮件地址,我建议您尝试一个模块,而不是编写自己的正则表达式。正确匹配所有电子邮件地址变得相当复杂。

但是,如果您只是想搜索给定的电子邮件地址,您可以使用一个相当简单的正则表达式来完成此操作:

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

my $count = 0;
my $email = 'foo@bar.com';

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

print "Found $email $count times";

__DATA__
foo@bar.com foo@bar.com

mr-foo@bar.com #not a match

old.foo@bar.com   #not a match
blah blah blah foo@bar.com blah blah
foo@bar.commmm #not a match

请注意,这要求电子邮件地址与任何其他内容用空格分隔。

几个注意事项: \Q...\E是引用文字转义。它确保电子邮件地址中的任何内容都不会被视为特殊的正则表达式字符(没有这个,.将匹配任何字符而不是文字句点)。

(?=...)是一个前瞻插入。这将匹配内容而不将其包含在实际匹配中。这很重要,因为单个空格可能在电子邮件的一次出现之前和另一次之后。为了匹配两者,您不希望第一个匹配“吃掉”那个空间。

于 2012-11-22T11:48:25.340 回答