【问题标题】:How can I filter email addresses that belong in a particular domain using Perl?如何使用 Perl 过滤属于特定域的电子邮件地址?
【发布时间】:2010-12-30 14:12:24
【问题描述】:

如何扫描包含以换行符分隔的电子邮件地址的文件并删除属于某个域的电子邮件地址,例如hacker@bad.com。我想删除所有@bad.com的电子邮件地址

【问题讨论】:

    标签: perl email-address


    【解决方案1】:

    使用grep 代替 Perl

    grep -v '@bad\.com' inputfile > outputfile
    

    在 Windows 上

    findstr /v "@bad\.com" inputfile > outputfile
    

    【讨论】:

    • “me@bad.com.*”怎么样?也要过滤掉吗?
    【解决方案2】:

    应该这样做:

    $badDomain = "bad.com";
    while(<>)
    {
            s{\s+$}{};
            print "$_\n" if(!/\@$badDomain$/);
    }
    

    【讨论】:

    • 由于我们从未chomp()-ed 行,默认情况下它的末尾已经有一个换行符。您不需要与另一个打印它(当然,除非您希望输出行之间有空白行)。
    • @Chris:如果您仔细查看第 4 行,我将删除所有尾随空格。这也将删除尾随的 \n 。所以打印中需要一个 \n。
    • 啊。在这种情况下,为什么不 s/\s+$/\n/; 保留换行符,然后只保留 print if /regex/
    【解决方案3】:

    此代码应从输入文件中过滤所有@bad.com 地址。

     my @array = <>;
    
     foreach(@array) {
       if(!/\@bad.com$/) {
         print $_;
       }
     }
    

    【讨论】:

    • 太糟糕了。你为什么要在 &lt;&gt; 中啜饮,因为你可以迭代它以获得相同的效果,几乎没有内存影响?
    【解决方案4】:

    Perl

    perl -ne 'print if !/@bad\.com/' file
    

    awk

    awk '!/@bad\.com/' file 
    

    【讨论】:

    • 这不是正确的模式。也不包括 notbad.com 等。
    【解决方案5】:

    以下内容将允许您拥有一个可以及时增强的脚本...而不是简单地过滤掉@bad.com(您可以使用简单的 grep 来完成),您可以编写脚本以便轻松确定哪些域是不需要的。

    my $bad_addresses = {'bad.com'=>1};
    
    while (my $s = <>) {
        print $s unless (is_bad_address($s));
    }
    
    sub is_bad_address {
        my ($addr) = @_;
        if ($addr=~/^([^@]+)\@([^@\n\r]+)$/o) {
            my $domain = lc($2);
            return 0 unless (defined $bad_addresses->{$domain});
            return $bad_addresses->{$domain};
        }
        return 1;
    }
    

    【讨论】:

      【解决方案6】:

      Email::Address 是一个很好的处理电子邮件地址的模块。

      这里有一个例子,可能会让你大吃一惊:

      use Email::Address;
      
      my $data = 'this person email is hacker@bad.com
      blah blah hacker@good.com blah blah
      another@bad.com
      ';
      
      my @emails      = Email::Address->parse( $data );
      my @good_emails = grep { $_->host ne 'bad.com' } @emails;
      
      say "@emails";       # => hacker@bad.com hacker@good.com another@bad.com
      say "@good_emails";  # => hacker@good.com
      

      【讨论】:

        【解决方案7】:

        与其他人所做的没有太大不同。

        use strict;
        use warnings;
        
        my @re = map { qr/@(.*\.)*\Q$_\E$/ } qw(bad.com mean.com);
        
        while (my $line = <DATA>) {
            chomp $line;
            if (grep { $line =~ /$_/ } @re) {
                print "Rejected: $line\n";
            } else {
                print "Allowed: $line\n";
            }
        }
        
        __DATA__
        good@good.com
        bad@bad.com
        notbad@bad.comm.com
        alsobad@bad.com
        othergood@good.com
        not@mean.com
        good@reallymean.com
        bad@really.mean.com
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-07
          • 1970-01-01
          • 2015-06-14
          • 1970-01-01
          • 2019-10-22
          • 1970-01-01
          • 2018-06-03
          • 1970-01-01
          相关资源
          最近更新 更多