目前我正在从匹配模式中获取第3行。在这种情况下q33BDrP9007220
是一个匹配模式,第三行将被打印,我也想打印第4行和第5行,但只有当第4行和第5行的模式与第3行模式匹配时才打印。并打印出这3行电子邮件ID在一行中以','分隔。
open (MYFILE,<$mailqdir);
while(<MYFILE>)
if(/(\w{14})/){
next unless \w{14})/ % 2;
$temp = scalar <MYFILE>;
$rf_id = $temp;
}
--------------输入-----------------
q33BDrP9007220 50153 Tue Apr 3 16:43 <mohitnegi@yahoo.com>
(Deferred: 451 4.2.1 mailbox temporarily disabled: paond.tndt)
<tarunsharma@yahoo.com>
<tararma@yahoo.com>
<tarsharma@yahoo.com>
q33BDrP9007220 50153 Tue Apr 3 16:43 <mohitnegi@yahoo.com>
(Deferred: 451 4.2.1 mailbox temporarily disabled: paond.tndt)
<tnsharma@yahoo.com>
<tama@yahoo.com>
<harma@yahoo.com>
q33BDrP9007220 50153 Tue Apr 3 16:43 <mohitnegi@yahoo.com>
(Deferred: 451 4.2.1 mailbox temporarily disabled: paond.tndt)
<tarunrma@yahoo.com>
<taarma@yahoo.com>
<tsharma@yahoo.com>
答案 0 :(得分:1)
此示例可能对您有所帮助:
#!/usr/bin/perl
use warnings;
use strict;
my @emails;
while (<DATA>) {
if (/^\w{14}\s/) {
<DATA>; # skip one line
output(@emails);
undef @emails; # forget emails
} elsif (/^\s+<([^>]+)>$/) {
push @emails, $1; # remember the email
}
}
# Print the last rememberd emails
output(@emails);
sub output {
print join(',', @_), "\n" if @_;
}
__DATA__
q33BDrP9007220 50153 Tue Apr 3 16:43 <mohitnegi@yahoo.com>
(Deferred: 451 4.2.1 mailbox temporarily disabled: paond.tndt)
<tarunsharma@yahoo.com>
<tararma@yahoo.com>
<tarsharma@yahoo.com>
q33BDrP9007220 50153 Tue Apr 3 16:43 <mohitnegi@yahoo.com>
(Deferred: 451 4.2.1 mailbox temporarily disabled: paond.tndt)
<tnsharma@yahoo.com>
<tama@yahoo.com>
<harma@yahoo.com>
q33BDrP9007220 50153 Tue Apr 3 16:43 <mohitnegi@yahoo.com>
(Deferred: 451 4.2.1 mailbox temporarily disabled: paond.tndt)
<tarunrma@yahoo.com>
<taarma@yahoo.com>
<tsharma@yahoo.com>
另外,请阅读StackOverflow上的Parsing the file perl - 可能是您的同事或同学发布的?
答案 1 :(得分:0)
我不确定我是否完全理解你的问题,不过还是开了一枪。
在while循环中,在第一个正则表达式之后,将电子邮件地址存储在变量中。
例如my $addressList = $1;
并设置临时变量my $temp = 1;
。
稍后您可以执行if ($temp)
,如果下一行与您的正则表达式匹配,则继续追加$ addressList变量,直到标记符(q33BDrP9007220)被击中。
HTH
答案 2 :(得分:0)
这就是我要去的方式
use strict;
use warnings;
my $file="input_file.txt";
open (FILE,"<$file") or die "Can't open $file: $!";
my $contents = do { local $/; <FILE> };
my @arr=split('q33BDrP9007220', $contents);
foreach my $ele(@arr)
{
$ele =~ s/([a-zA-Z0-9_.]+@[a-zA-Z]+\.[a-zA-Z]{2,4})//;
$ele =~ s/.*?([a-zA-Z0-9_.]+@[a-zA-Z]+\.[a-zA-Z]{2,4})/$1 ,/sg;
print $ele;
}
您可以使用自己的电子邮件地址更改正则结构([a-zA-Z0-9_.]+@[a-zA-Z]+\.[a-zA-Z]{2,4})
。