在perl中创建一个简单的过滤器

时间:2015-03-31 10:53:35

标签: regex perl

我有一个包含大量电子邮件的文件,看起来像这样:

From: tommy@gmail.com 
Date: 10 Nov 2014 09:19:59 +0100 (MET)
To: jonny@jonrocks.com
Subject: Let's go have a beer
Hey Jonny, let's have a drink tonight. See ya, Tommy


From: alice@gmail.com 
Date: 11 Dec 2014 19:16:49 +0100 (MET)
To: martha@hotmail.com
Subject: Meeting 
Dear Martha,
Note that our Monday meeting will take place at 10:00 instead of 13:00.
Best regards,
Alice

我正在写一个perl脚本,允许用户从标题中提供输入并向他返回一条消息 例如,用户可能会输入from alice subject meeting并收到电子邮件。

到目前为止,我有这段代码我不知道如何继续

    open(IN, "<emails.txt") or die "Can't open the file";
    print "Enter the search elements from the header:\n";
    chomp($input=<STDIN>);
    # example input from alice subject meeting

    ($from, $who, $where, $what)=split/ /, $input;


while (<IN>)
{
   if( /$from(.)+$who/i ){
    while (<IN>){
          if(/$where(.)+$what/i){
            while ($line = <IN>){
                print $line;
            }
          }

        }  

   }
}  

1 个答案:

答案 0 :(得分:0)

我建议您在这里使用第一个端口,实际上是解析邮件头。

电子邮件具有已定义的格式,基本上表示电子邮件的第一行是Headername: header_value\n格式的标题。标题末尾标有\n\n。 (例如,两个换行符),这就是你知道你在“身体”部分的方式。

你的样品虽然没有显示 - 你确定这是你必须使用的吗?

无论如何 - 电子邮件也结束并带有一个空行。不幸的是,没有简单的方法来区分在电子邮件中输入From: me的人,因为它是标题 - 电子邮件是纯文本。

我建议从一个模块开始为你做这个。 Email::Simple看起来很有希望。

失败 - 您可以使用每个标题行拆分,以及:的分隔符。

my %headers; 
while ( <$input> ) {
    if ( m/\w+\:/ ) { 
        my ( $header, $value ) = split ( /:/ );
        $headers{$header} = $value;
    }
}

但是如果你这样做,你可以提供一个类似的参数:From=janet并让正则表达式与你的From字段匹配。