2015-03-31 46 views
0

一个简单的过滤器我有一个包含了一堆邮件,看起来像这样一个文件:创建在Perl

From: [email protected] 
Date: 10 Nov 2014 09:19:59 +0100 (MET) 
To: [email protected] 
Subject: Let's go have a beer 
Hey Jonny, let's have a drink tonight. See ya, Tommy 


From: [email protected] 
Date: 11 Dec 2014 19:16:49 +0100 (MET) 
To: [email protected] 
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; 
      } 
      } 

     } 

    } 
} 
+0

恐怕“不确定如何继续”意味着您的问题可能对于堆栈溢出而言过于宽泛。如果你有一个特定的事情,你有问题,那么它可以有意义的回答。 – Sobrique 2015-03-31 11:36:39

+0

@Sobique谢谢你的评论。我希望有人能找到逻辑上的缺陷,并给我正确的方向。 – Nat 2015-03-31 11:40:42

回答

0

我会在这里建议您的第一个停靠港,实际上是解析邮件标题。

电子邮件有一个定义的格式,基本上说,电子邮件的第一行是Headername: header_value\n形式的标题。标题末尾标有\n\n。 (例如两个换行符),这就是您如何知道自己在“body”部分中的方式。

虽然您的示例没有显示 - 你确定这就是你一直在使用?

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

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

失败 - 您可以使用按标题行分割,并使用:的分隔符。

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

但是,如果你这样做,你可以提供一个参数,如:From=janet并将它正则表达式您From场相匹配。

+0

谢谢你,Sobrique!我将尝试Email :: Simple模块。 – Nat 2015-03-31 11:58:21