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 に答える