2012-06-07 2 views
0

В настоящее время я сглаживаю 3-ю строку от соответствующего шаблона. В этом случае q33BDrP9007220 будет сопоставляемым шаблоном, и будет напечатана 3-я строка, я хочу также напечатать 4-ю и 5-ю строки, но только если рисунок 4-й и 5-й строк соответствует шаблону 3-й строки. И распечатайте эти 3 идентификатора электронной почты в одном строка, разделенная символом ','.печатать строки под соответствующей строкой

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 <[email protected]> 
       (Deferred: 451 4.2.1 mailbox temporarily disabled: paond.tndt) 
             <[email protected]> 
             <[email protected]> 
             <[email protected]> 
q33BDrP9007220 50153 Tue Apr 3 16:43 <[email protected]> 
       (Deferred: 451 4.2.1 mailbox temporarily disabled: paond.tndt) 
             <[email protected]> 
             <[email protected]> 
             <[email protected]> 
q33BDrP9007220 50153 Tue Apr 3 16:43 <[email protected]> 
      (Deferred: 451 4.2.1 mailbox temporarily disabled: paond.tndt) 
            <[email protected]> 
            <[email protected]> 
            <[email protected]> 
+0

Возможно [дублированный вопрос] (http://stackoverflow.com/questions/10877118/putting-2-consecutive-lines-of-same-matching-pattern-into-singleline). Я думаю, это близко к тому, что вы хотите. –

ответ

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 <[email protected]> 
       (Deferred: 451 4.2.1 mailbox temporarily disabled: paond.tndt) 
             <[email protected]> 
             <[email protected]> 
             <[email protected]> 
q33BDrP9007220 50153 Tue Apr 3 16:43 <[email protected]> 
       (Deferred: 451 4.2.1 mailbox temporarily disabled: paond.tndt) 
             <[email protected]> 
             <[email protected]> 
             <[email protected]> 
q33BDrP9007220 50153 Tue Apr 3 16:43 <[email protected]> 
      (Deferred: 451 4.2.1 mailbox temporarily disabled: paond.tndt) 
            <[email protected]> 
            <[email protected]> 
            <[email protected]> 

Кроме того, читайте Parsing the file perl здесь, на StackOverflow - отвечал вашим коллегой или одноклассником, может быть?

0

Я не уверен, Я полностью понял ваш вопрос, сделав тем самым выстрел.

Внутри цикла while, после первого регулярного выражения, сохраните адрес электронной почты в переменной. , например. my $addressList = $1; и установите временную переменную my $temp = 1;. Позже вы можете сделать if ($temp), и если следующая строка соответствует вашему регулярному выражению, вы добавите переменную $ addressList до тех пор, пока не будет достигнут маркер (q33BDrP9007220).

НТН

+0

Спасибо user1441609 Я уже сохраняю адрес электронной почты в $ rf_id, но если я ищу шаблон и распечатаю его следующую строку, он никогда не даст мне результата, так как он всегда будет идти в первый цикл и искать его действительность –

+0

В этом случае вы скорее всего, лучше перефразировать вопрос, можете ли вы расширить то, что вы пытаетесь сделать. И, может быть, проиллюстрировать это на примере того, что ваш ожидаемый результат? – user1441609

+0

Кстати, вы должны также упомянуть, что это значит? 'next if \ w {14}) /% 2;' и почему вы читаете весь файл как скаляр снова в цикле while? – user1441609

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_.][email protected][a-zA-Z]+\.[a-zA-Z]{2,4})//; 

    $ele =~ s/.*?([a-zA-Z0-9_.][email protected][a-zA-Z]+\.[a-zA-Z]{2,4})/$1 ,/sg; 

    print $ele; 

} 

Вы можете изменить регулярное выражение ([a-zA-Z0-9_.][email protected][a-zA-Z]+\.[a-zA-Z]{2,4}) по адресу электронной почты с вашим собственным.

Смежные вопросы